]> granicus.if.org Git - php/commitdiff
Only allow single comma in tail
authorXinchen Hui <laruence@gmail.com>
Tue, 14 Jun 2016 06:02:34 +0000 (14:02 +0800)
committerXinchen Hui <laruence@gmail.com>
Tue, 14 Jun 2016 06:02:34 +0000 (14:02 +0800)
Zend/tests/list_013.phpt [new file with mode: 0644]
Zend/zend_ast.h
Zend/zend_compile.c

diff --git a/Zend/tests/list_013.phpt b/Zend/tests/list_013.phpt
new file mode 100644 (file)
index 0000000..2869f5f
--- /dev/null
@@ -0,0 +1,10 @@
+--TEST--
+Disallow tail empty elements in normal arrays
+--FILE--
+<?php
+
+var_dump([1, 2, ,]);
+
+?>
+--EXPECTF--
+Fatal error: Cannot use empty array elements in arrays in %s on line %d
index 3efadf71645e2b28697457270171f92ac92ca82d..de67c50c9fa10bf46ff77c1c30b598d40982ec9a 100644 (file)
@@ -268,7 +268,7 @@ static zend_always_inline zend_ast *zend_ast_create_cast(uint32_t type, zend_ast
 }
 static zend_always_inline void zend_ast_list_rtrim(zend_ast *ast) {
        zend_ast_list *list = zend_ast_get_list(ast);
-       while (list->children && list->child[list->children - 1] == NULL) {
+       if (list->children && list->child[list->children - 1] == NULL) {
                list->children--;
        }
 }
index 63bd813092881d3856efd4e59366ac5ae5201bda..962f2eea66d37b6aabf983e65199667f30b9b02b 100644 (file)
@@ -2762,10 +2762,7 @@ static void zend_verify_list_assign_target(zend_ast *var_ast, zend_bool old_styl
 static void zend_compile_unkeyed_list_assign(zend_ast_list *list, znode *expr_node, zend_bool old_style) /* {{{ */
 {
        uint32_t i;
-
-       if (list->children == 0) {
-               zend_error_noreturn(E_COMPILE_ERROR, "Cannot use empty list");
-       }
+       zend_bool has_elems = 0;
 
        for (i = 0; i < list->children; ++i) {
                zend_ast *elem_ast = list->child[i];
@@ -2780,6 +2777,7 @@ static void zend_compile_unkeyed_list_assign(zend_ast_list *list, znode *expr_no
                }
 
                var_ast = elem_ast->child[0];
+               has_elems = 1;
 
                dim_node.op_type = IS_CONST;
                ZVAL_LONG(&dim_node.u.constant, i);
@@ -2797,6 +2795,11 @@ static void zend_compile_unkeyed_list_assign(zend_ast_list *list, znode *expr_no
                zend_emit_op(&fetch_result, ZEND_FETCH_LIST, expr_node, &dim_node);
                zend_emit_assign_znode(var_ast, &fetch_result);
        }
+
+       if (has_elems == 0) {
+               zend_error_noreturn(E_COMPILE_ERROR, "Cannot use empty list");
+       }
+
 }
 /* }}} */