Skip to content

Commit cf09bc7

Browse files
committed
Fixed bug #67874 (Crash in array_map())
1 parent 9507aa9 commit cf09bc7

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

Zend/tests/bug67874.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
Bug #67874 Crash in array_map()
3+
--FILE--
4+
<?php
5+
$a = array(1,2,3);
6+
$data = array($a);
7+
$data = array_map('current', $data);
8+
var_dump($data);
9+
?>
10+
--EXPECT--
11+
array(1) {
12+
[0]=>
13+
int(1)
14+
}

ext/standard/array.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4438,7 +4438,7 @@ PHP_FUNCTION(array_map)
44384438
if (n_arrays == 1) {
44394439
ulong num_key;
44404440
zend_string *str_key;
4441-
zval *zv;
4441+
zval *zv, arg;
44424442

44434443
if (Z_TYPE(arrays[0]) != IS_ARRAY) {
44444444
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d should be an array", 2);
@@ -4457,20 +4457,18 @@ PHP_FUNCTION(array_map)
44574457
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(arrays[0]), num_key, str_key, zv) {
44584458
fci.retval = &result;
44594459
fci.param_count = 1;
4460-
fci.params = zv;
4460+
fci.params = &arg;
44614461
fci.no_separation = 0;
44624462

4463-
if (Z_REFCOUNTED_P(zv)) {
4464-
Z_ADDREF_P(zv);
4465-
}
4463+
ZVAL_COPY(&arg, zv);
44664464

44674465
if (zend_call_function(&fci, &fci_cache TSRMLS_CC) != SUCCESS || Z_TYPE(result) == IS_UNDEF) {
44684466
php_error_docref(NULL TSRMLS_CC, E_WARNING, "An error occurred while invoking the map callback");
44694467
zval_dtor(return_value);
4470-
zval_ptr_dtor(zv);
4468+
zval_ptr_dtor(&arg);
44714469
RETURN_NULL();
44724470
} else {
4473-
zval_ptr_dtor(zv);
4471+
zval_ptr_dtor(&arg);
44744472
}
44754473
if (str_key) {
44764474
zend_hash_add_new(Z_ARRVAL_P(return_value), str_key, &result);

0 commit comments

Comments
 (0)