From fb235dc07fc7246ed6195da33b6f1b691425f78e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 8 Jul 2009 18:23:08 +0000 Subject: [PATCH] - MFH: Fixed bug #48854 (array_merge_recursive modifies arrays after first one) --- NEWS | 2 ++ ext/standard/array.c | 1 + ext/standard/tests/array/bug48854.phpt | 43 ++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 ext/standard/tests/array/bug48854.phpt diff --git a/NEWS b/NEWS index 5d7413c3d8..e8838c7fd3 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,8 @@ PHP NEWS - Fixed spl_autoload_unregister/spl_autoad_functions wrt. Closures and Functors. (Christian Seiler) +- Fixed bug #48854 (array_merge_recursive modifies arrays after first one). + (Felipe) - Fixed bug #48788 (RecursiveDirectoryIterator doesn't descend into symlinked directories). (Ilia) - Fixed bug #48771 (rename() between volumes fails and reports no error on diff --git a/ext/standard/array.c b/ext/standard/array.c index 798895e180..e9a68463c6 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2305,6 +2305,7 @@ static void php_array_merge_or_replace_wrapper(INTERNAL_FUNCTION_PARAMETERS, int array_init_size(return_value, init_size); for (i = 0; i < argc; i++) { + SEPARATE_ZVAL(args[i]); if (!replace) { php_array_merge(Z_ARRVAL_P(return_value), Z_ARRVAL_PP(args[i]), recursive TSRMLS_CC); } else if (recursive && i > 0) { /* First array will be copied directly instead */ diff --git a/ext/standard/tests/array/bug48854.phpt b/ext/standard/tests/array/bug48854.phpt new file mode 100644 index 0000000000..0908637503 --- /dev/null +++ b/ext/standard/tests/array/bug48854.phpt @@ -0,0 +1,43 @@ +--TEST-- +Bug #48854 (array_merge_recursive modifies arrays after first one) +--FILE-- + 5, + 'children' => array( + 'dogs' => 0, + ), +); + +$array2 = array( + 'friends' => 10, + 'children' => array( + 'cats' => 5, + ), +); + +$merged = array_merge_recursive($array1, $array2); + +var_dump($array1, $array2); + +?> +--EXPECTF-- +array(2) { + [%u|b%"friends"]=> + int(5) + [%u|b%"children"]=> + array(1) { + [%u|b%"dogs"]=> + int(0) + } +} +array(2) { + [%u|b%"friends"]=> + int(10) + [%u|b%"children"]=> + array(1) { + [%u|b%"cats"]=> + int(5) + } +} -- 2.50.0