]> granicus.if.org Git - php/commitdiff
Fix declare error behavior so that improper usages will actually error
authorAnthony Ferrara <ircmaxell@gmail.com>
Fri, 20 Feb 2015 16:43:18 +0000 (11:43 -0500)
committerAnthony Ferrara <ircmaxell@gmail.com>
Fri, 20 Feb 2015 16:43:18 +0000 (11:43 -0500)
Zend/tests/bug69092.2.phpt [new file with mode: 0644]
Zend/tests/bug69092.phpt [new file with mode: 0644]
Zend/zend_compile.c
ext/mbstring/tests/zend_multibyte-10.phpt
ext/mbstring/tests/zend_multibyte-11.phpt
ext/mbstring/tests/zend_multibyte-15.phpt [new file with mode: 0644]
ext/mbstring/tests/zend_multibyte-16.phpt [new file with mode: 0644]

diff --git a/Zend/tests/bug69092.2.phpt b/Zend/tests/bug69092.2.phpt
new file mode 100644 (file)
index 0000000..b3f4bff
--- /dev/null
@@ -0,0 +1,18 @@
+--TEST--
+Bug #69092-2 (Declare Encoding Compile Check Wrong) - multibyte off
+--INI--
+zend.multibyte=0
+--FILE--
+<?php
+echo "Hi";
+
+function foo() {
+       declare(encoding="UTF-8");
+}
+
+echo "Bye"
+?>
+--EXPECTF--
+Warning: declare(encoding=...) ignored because Zend multibyte feature is turned off by settings in %s on line %d
+
+Fatal error: Encoding declaration pragma must be the very first statement in the script in %s on line %d
\ No newline at end of file
diff --git a/Zend/tests/bug69092.phpt b/Zend/tests/bug69092.phpt
new file mode 100644 (file)
index 0000000..1963d7b
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+Bug #69092 (Declare Encoding Compile Check Wrong)
+--SKIPIF--
+<?php
+if (!extension_loaded("mbstring")) {
+  die("skip Requires mbstring extension");
+}
+?>
+--INI--
+zend.multibyte=On
+--FILE--
+<?php
+echo "Hi";
+
+function foo() {
+       declare(encoding="utf-8");
+}
+
+echo "Bye"
+?>
+--EXPECTF--
+Fatal error: Encoding declaration pragma must be the very first statement in the script in %s on line %d
\ No newline at end of file
index 2608cf150a438bd44ce59fd3396871e5febf9882..c5479af516c55367a8a320bab281db26809409d7 100644 (file)
@@ -3806,14 +3806,24 @@ void zend_compile_declare(zend_ast *ast) /* {{{ */
                } else if (zend_string_equals_literal_ci(name, "encoding")) {
                        /* Encoding declaration was already handled during parsing. Here we
                         * only check that it is the first statement in the file. */
-                       uint32_t num = CG(active_op_array)->last;
-                       while (num > 0 &&
-                                  (CG(active_op_array)->opcodes[num-1].opcode == ZEND_EXT_STMT ||
-                                       CG(active_op_array)->opcodes[num-1].opcode == ZEND_TICKS)) {
-                               --num;
+                       zend_ast_list *file_ast = zend_ast_get_list(CG(ast));
+                       
+                       size_t i = 0;
+                       signed char valid = 0;
+
+                       /* Check to see if this declare is preceeded only by declare statements */
+                       while (valid == 0 && i < file_ast->children) {
+                               if (file_ast->child[i] == ast) {
+                                       valid = 1;
+                               } else if (file_ast->child[i] == NULL) {
+                                       valid = -1;
+                               } else if (file_ast->child[i]->kind != ZEND_AST_DECLARE) {
+                                       /* declares can only be preceeded by other declares */
+                                       valid = -1;
+                               }
+                               i++;
                        }
-
-                       if (num > 0) {
+                       if (valid != 1) {
                                zend_error_noreturn(E_COMPILE_ERROR, "Encoding declaration pragma must be "
                                        "the very first statement in the script");
                        }
index 138b4899fea32c16bba6b7d4d0a43625491345fe..ef8ce9d0bcb797360dcd64de7c2a1d8b2c550f6e 100644 (file)
@@ -9,4 +9,4 @@ declare(encoding="ISO-8859-1");
 echo "ok\n";
 ?>
 --EXPECTF--
-ok
+ok
\ No newline at end of file
index 6844d06370f925fd84e0549d04ac075dd863aa16..0f9874b538d08f5ad6bd441538edc504f8041ad0 100644 (file)
@@ -10,4 +10,4 @@ declare(encoding="ISO-8859-15") {
 }
 ?>
 --EXPECTF--
-ok
+Fatal error: Encoding declaration pragma must be the very first statement in the script in %s on line %d
\ No newline at end of file
diff --git a/ext/mbstring/tests/zend_multibyte-15.phpt b/ext/mbstring/tests/zend_multibyte-15.phpt
new file mode 100644 (file)
index 0000000..6995444
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+zend multibyte (15)
+--INI--
+zend.multibyte=1
+--FILE--
+<?php
+declare(encoding="ISO-8859-15") {
+       echo "ok\n";
+}
+declare(encoding="UTF-8") {
+       echo "ok\n";
+}
+?>
+--EXPECTF--
+ok
+ok
\ No newline at end of file
diff --git a/ext/mbstring/tests/zend_multibyte-16.phpt b/ext/mbstring/tests/zend_multibyte-16.phpt
new file mode 100644 (file)
index 0000000..4470e3a
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+zend multibyte (16)
+--INI--
+zend.multibyte=1
+--FILE--
+<?php
+declare(encoding="ISO-8859-15") {
+       echo "ok\n";
+}
+echo "ok\n";
+?>
+--EXPECTF--
+ok
+ok
\ No newline at end of file