]> granicus.if.org Git - php/commitdiff
Fix refcounting for the named params case as well
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 24 Aug 2020 14:30:49 +0000 (16:30 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 24 Aug 2020 14:30:49 +0000 (16:30 +0200)
Adjust the test case to pass a refcounted value and to also check
the named params case.

Zend/tests/bug79979.phpt
Zend/zend_execute_API.c

index c41d3889e965e5767af4e94b6544a1d0f8b2e7c1..d655a0edce5773c2159536a88e52cefbf4eac1d4 100644 (file)
@@ -2,12 +2,15 @@
 Bug #79979 (passing value to by-ref param via CUF(A) crashes)
 --FILE--
 <?php
-call_user_func_array("str_replace", ["a", "b", "c", 0]);
 
-$cufa = "call_user_func_array";
-$cufa("str_replace", ["a", "b", "c", 0]);
+namespace Foo;
+
+call_user_func_array("str_replace", ["a", "b", "c", new \stdClass]);
+call_user_func_array("str_replace", ["a", "b", "c", "replace_count" => new \stdClass]);
+
+\call_user_func_array("str_replace", ["a", "b", "c", new \stdClass]);
+\call_user_func_array("str_replace", ["a", "b", "c", "replace_count" => new \stdClass]);
 
-call_user_func_array($cufa, ["str_replace", ["a", "b", "c", 0]]);
 ?>
 --EXPECTF--
 Warning: str_replace(): Argument #4 ($replace_count) must be passed by reference, value given in %s on line %d
@@ -15,3 +18,5 @@ Warning: str_replace(): Argument #4 ($replace_count) must be passed by reference
 Warning: str_replace(): Argument #4 ($replace_count) must be passed by reference, value given in %s on line %d
 
 Warning: str_replace(): Argument #4 ($replace_count) must be passed by reference, value given in %s on line %d
+
+Warning: str_replace(): Argument #4 ($replace_count) must be passed by reference, value given in %s on line %d
index 5a0e2a48f1e2d9dacdec4d136856ecb931ba6c34..0e721c451e9a6490edfe269cc9cc28bc270319e0 100644 (file)
@@ -826,6 +826,7 @@ cleanup_args:
                        if (EXPECTED(!must_wrap)) {
                                ZVAL_COPY(target, arg);
                        } else {
+                               Z_TRY_ADDREF_P(arg);
                                ZVAL_NEW_REF(target, arg);
                        }
                        if (!name) {