]> granicus.if.org Git - php/commitdiff
Fixed bug #72441 (Segmentation fault: RFC list_keys)
authorXinchen Hui <laruence@gmail.com>
Fri, 17 Jun 2016 16:34:15 +0000 (09:34 -0700)
committerXinchen Hui <laruence@gmail.com>
Fri, 17 Jun 2016 16:34:15 +0000 (09:34 -0700)
NEWS
Zend/tests/bug72441.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/NEWS b/NEWS
index fbc281c85c6fc99ea639b8c6bfb3869678e3be0b..f6729343a5b3ddecd6d8c534edf8ffe58241261c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,9 +3,10 @@ PHP                                                                        NEWS
 ?? ??? 2016, PHP 7.1.0alpha2
 
 - Core:
-  . Implemented RFC: Replace "Missing argument" warning with "Too few
+  . Implemented RFC: R/eplace "Missing argument" warning with "Too few
     arguments" exception. (Dmitry)
   . Implemented RFC: Fix inconsistent behavior of $this variable. (Dmitry)
+  . Fixed bug #72441 (Segmentation fault: RFC list_keys). (Laruence)
   . Fixed bug #72395 (list() regression). (Laruence)
   . Fixed bug #72373 (TypeError after Generator function w/declared return type
     finishes). (Nikita)
diff --git a/Zend/tests/bug72441.phpt b/Zend/tests/bug72441.phpt
new file mode 100644 (file)
index 0000000..af57b3a
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+Bug #72441 (Segmentation fault: RFC list_keys)
+--FILE--
+<?php
+
+$array = [];
+
+list(
+       '' => $foo,
+       $bar
+) = $array;
+?>
+--EXPECTF--
+Fatal error: Cannot mix keyed and unkeyed array entries in assignments in %sbug72441.php on line %d
index 02507f2366be575f44e8944a74ec95a1c85875d2..1d544c6561ead4732d48314250be878cef460060 100644 (file)
@@ -2819,6 +2819,10 @@ static void zend_compile_keyed_list_assign(zend_ast_list *list, znode *expr_node
                        zend_error(E_COMPILE_ERROR, "[] and list() assignments cannot be by reference");
                }
 
+               if (key_ast == NULL) {
+                       zend_error(E_COMPILE_ERROR, "Cannot mix keyed and unkeyed array entries in assignments");
+               }
+
                zend_compile_expr(&dim_node, key_ast);
 
                if (expr_node->op_type == IS_CONST) {
@@ -2829,10 +2833,6 @@ static void zend_compile_keyed_list_assign(zend_ast_list *list, znode *expr_node
                        zend_error(E_COMPILE_ERROR, "Cannot use empty array entries in keyed array");
                }
 
-               if (key_ast == NULL) {
-                       zend_error(E_COMPILE_ERROR, "Cannot mix keyed and unkeyed array entries in assignments");
-               }
-
                zend_verify_list_assign_target(var_ast, old_style);
 
                zend_emit_op(&fetch_result, ZEND_FETCH_LIST, expr_node, &dim_node);