]> granicus.if.org Git - php/commitdiff
Fix bug #42850 array_walk_recursive() leaves references, refix bug #34982
authorBrian Shire <shire@php.net>
Mon, 14 Jan 2008 22:08:00 +0000 (22:08 +0000)
committerBrian Shire <shire@php.net>
Mon, 14 Jan 2008 22:08:00 +0000 (22:08 +0000)
ext/standard/array.c
ext/standard/tests/array/bug42850.phpt [new file with mode: 0644]

index 41716c426b08ff6b04cecf30f531504daca37f23..e7345fc1880e3907111462cf71c149e70812e996 100644 (file)
@@ -1061,7 +1061,7 @@ static int php_array_walk(HashTable *target_hash, zval **userdata, int recursive
                        zend_fcall_info orig_array_walk_fci;
                        zend_fcall_info_cache orig_array_walk_fci_cache;
 
-                       SEPARATE_ZVAL_TO_MAKE_IS_REF(args[0]);
+                       SEPARATE_ZVAL_IF_NOT_REF(args[0]);
                        thash = HASH_OF(*(args[0]));
                        if (thash->nApplyCount > 1) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion detected");
diff --git a/ext/standard/tests/array/bug42850.phpt b/ext/standard/tests/array/bug42850.phpt
new file mode 100644 (file)
index 0000000..73d37cf
--- /dev/null
@@ -0,0 +1,93 @@
+--TEST--
+Bug #42850 array_walk_recursive() leaves references, #34982 array_walk_recursive() modifies elements outside function scope 
+--FILE--
+<?php
+
+// Bug #42850
+$data = array ('key1' => 'val1', array('key2' => 'val2'));
+function apply_dumb($item, $key) {}; 
+var_dump($data);
+array_walk_recursive($data, 'apply_dumb');
+$data2 = $data;
+$data2[0] = 'altered';
+var_dump($data);
+var_dump($data2);
+
+// Bug #34982
+function myfunc($data) {
+    array_walk_recursive($data, 'apply_changed');
+}
+function apply_changed(&$input, $key) {
+    $input = 'changed';
+}
+myfunc($data);
+var_dump($data);
+
+--EXPECT--
+array(2) {
+  ["key1"]=>
+  string(4) "val1"
+  [0]=>
+  array(1) {
+    ["key2"]=>
+    string(4) "val2"
+  }
+}
+array(2) {
+  ["key1"]=>
+  string(4) "val1"
+  [0]=>
+  array(1) {
+    ["key2"]=>
+    string(4) "val2"
+  }
+}
+array(2) {
+  ["key1"]=>
+  string(4) "val1"
+  [0]=>
+  string(7) "altered"
+}
+array(2) {
+  ["key1"]=>
+  string(4) "val1"
+  [0]=>
+  array(1) {
+    ["key2"]=>
+    string(4) "val2"
+  }
+}
+--UEXPECT--
+array(2) {
+  [u"key1"]=>
+  unicode(4) "val1"
+  [0]=>
+  array(1) {
+    [u"key2"]=>
+    unicode(4) "val2"
+  }
+}
+array(2) {
+  [u"key1"]=>
+  unicode(4) "val1"
+  [0]=>
+  array(1) {
+    [u"key2"]=>
+    unicode(4) "val2"
+  }
+}
+array(2) {
+  [u"key1"]=>
+  unicode(4) "val1"
+  [0]=>
+  unicode(7) "altered"
+}
+array(2) {
+  [u"key1"]=>
+  unicode(4) "val1"
+  [0]=>
+  array(1) {
+    [u"key2"]=>
+    unicode(4) "val2"
+  }
+}