]> granicus.if.org Git - php/commitdiff
Fix handling of parse_str() with unpack in optimizer
authorNikita Popov <nikic@php.net>
Sun, 5 Jun 2016 20:16:15 +0000 (22:16 +0200)
committerNikita Popov <nikic@php.net>
Sun, 5 Jun 2016 20:16:15 +0000 (22:16 +0200)
Zend/tests/parse_str_with_unpack.phpt [new file with mode: 0644]
ext/opcache/Optimizer/zend_optimizer.c

diff --git a/Zend/tests/parse_str_with_unpack.phpt b/Zend/tests/parse_str_with_unpack.phpt
new file mode 100644 (file)
index 0000000..50b296d
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Calling parse_str through argument unpacking
+--FILE--
+<?php
+
+function test() {
+    $i = 0;
+    parse_str(...["i=41"]);
+    var_dump($i + 1);
+}
+test();
+
+?>
+--EXPECT--
+int(42)
index ea0deb53c81f570882780a8c12ffa67d8d9bbb7b..35dff983625851daa584e4810bb974b4599500ff 100644 (file)
@@ -596,9 +596,9 @@ uint32_t zend_optimizer_classify_function(zend_string *name, uint32_t num_args)
                return ZEND_FUNC_INDIRECT_VAR_ACCESS;
        } else if (zend_string_equals_literal(name, "compact")) {
                return ZEND_FUNC_INDIRECT_VAR_ACCESS;
-       } else if (zend_string_equals_literal(name, "parse_str") && num_args == 1) {
+       } else if (zend_string_equals_literal(name, "parse_str") && num_args <= 1) {
                return ZEND_FUNC_INDIRECT_VAR_ACCESS;
-       } else if (zend_string_equals_literal(name, "mb_parse_str") && num_args == 1) {
+       } else if (zend_string_equals_literal(name, "mb_parse_str") && num_args <= 1) {
                return ZEND_FUNC_INDIRECT_VAR_ACCESS;
        } else if (zend_string_equals_literal(name, "get_defined_vars")) {
                return ZEND_FUNC_INDIRECT_VAR_ACCESS;