summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-08-20 22:06:15 +0400
committerDmitry Stogov <dmitry@zend.com>2014-08-20 22:06:15 +0400
commitcf09bc7825fc38a49b878beb9e73093aa0b7cf7e (patch)
tree1518685581f5000a7847a310ba4f2407c663d840
parent9507aa99fc068578fc1ab28a61bb4d122f8b6eff (diff)
downloadphp-git-cf09bc7825fc38a49b878beb9e73093aa0b7cf7e.tar.gz
Fixed bug #67874 (Crash in array_map())
-rw-r--r--Zend/tests/bug67874.phpt14
-rw-r--r--ext/standard/array.c12
2 files changed, 19 insertions, 7 deletions
diff --git a/Zend/tests/bug67874.phpt b/Zend/tests/bug67874.phpt
new file mode 100644
index 0000000000..d851c9a4c1
--- /dev/null
+++ b/Zend/tests/bug67874.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Bug #67874 Crash in array_map()
+--FILE--
+<?php
+$a = array(1,2,3);
+$data = array($a);
+$data = array_map('current', $data);
+var_dump($data);
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ int(1)
+}
diff --git a/ext/standard/array.c b/ext/standard/array.c
index b503162b86..39526c25b7 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -4438,7 +4438,7 @@ PHP_FUNCTION(array_map)
if (n_arrays == 1) {
ulong num_key;
zend_string *str_key;
- zval *zv;
+ zval *zv, arg;
if (Z_TYPE(arrays[0]) != IS_ARRAY) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d should be an array", 2);
@@ -4457,20 +4457,18 @@ PHP_FUNCTION(array_map)
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(arrays[0]), num_key, str_key, zv) {
fci.retval = &result;
fci.param_count = 1;
- fci.params = zv;
+ fci.params = &arg;
fci.no_separation = 0;
- if (Z_REFCOUNTED_P(zv)) {
- Z_ADDREF_P(zv);
- }
+ ZVAL_COPY(&arg, zv);
if (zend_call_function(&fci, &fci_cache TSRMLS_CC) != SUCCESS || Z_TYPE(result) == IS_UNDEF) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "An error occurred while invoking the map callback");
zval_dtor(return_value);
- zval_ptr_dtor(zv);
+ zval_ptr_dtor(&arg);
RETURN_NULL();
} else {
- zval_ptr_dtor(zv);
+ zval_ptr_dtor(&arg);
}
if (str_key) {
zend_hash_add_new(Z_ARRVAL_P(return_value), str_key, &result);