]> granicus.if.org Git - php/commitdiff
Fixed bug #71922
authorNikita Popov <nikic@php.net>
Tue, 29 Mar 2016 17:29:19 +0000 (19:29 +0200)
committerNikita Popov <nikic@php.net>
Tue, 29 Mar 2016 17:29:19 +0000 (19:29 +0200)
NEWS
Zend/tests/bug71922.phpt [new file with mode: 0644]
Zend/zend_ast.c

diff --git a/NEWS b/NEWS
index 4af909d23f52c2059fb7720c54e5d760ad374456..abf70d04c1ffa14b775ee2941f3f1a0133335044 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,7 @@ PHP                                                                        NEWS
     (Nikita)
   . Fixed bug #62059 (ArrayObject and isset are not friends). (Nikita)
   . Fixed bug #71871 (Interfaces allow final and abstract functions). (Nikita)
+  . Fixed bug #71922 (Crash on assert(new class{})). (Nikita)
 
 - Curl:
   . Fixed bug #71831 (CURLOPT_NOPROXY applied as long instead of string).
diff --git a/Zend/tests/bug71922.phpt b/Zend/tests/bug71922.phpt
new file mode 100644 (file)
index 0000000..986254c
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Bug #71922: Crash on assert(new class{});
+--INI--
+zend.assertions=1
+assert.exception=1
+--FILE--
+<?php
+
+try {
+    assert(0 && new class {
+    } && new class(42) extends stdclass {
+    });
+} catch (AssertionError $e) {
+    echo "Assertion failure: ", $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Assertion failure: assert(0 && new class {
+} && new class(42) extends stdclass {
+})
index 6540f82c6b3c1e6e1f2cec9daf3d0f0543377504..cfcd636269cb8ec509f32980375fdfdaafa7c32a 100644 (file)
@@ -922,6 +922,21 @@ static void zend_ast_export_zval(smart_str *str, zval *zv, int priority, int ind
        }
 }
 
+static void zend_ast_export_class_no_header(smart_str *str, zend_ast_decl *decl, int indent) {
+       if (decl->child[0]) {
+               smart_str_appends(str, " extends ");
+               zend_ast_export_ns_name(str, decl->child[0], 0, indent);
+       }
+       if (decl->child[1]) {
+               smart_str_appends(str, " implements ");
+               zend_ast_export_ex(str, decl->child[1], 0, indent);
+       }
+       smart_str_appends(str, " {\n");
+       zend_ast_export_stmt(str, decl->child[2], indent + 1);
+       zend_ast_export_indent(str, indent);
+       smart_str_appends(str, "}");
+}
+
 #define BINARY_OP(_op, _p, _pl, _pr) do { \
                op = _op; \
                p = _p; \
@@ -1048,18 +1063,8 @@ tail_call:
                                smart_str_appends(str, "class ");
                        }
                        smart_str_appendl(str, ZSTR_VAL(decl->name), ZSTR_LEN(decl->name));
-                       if (decl->child[0]) {
-                               smart_str_appends(str, " extends ");
-                               zend_ast_export_ns_name(str, decl->child[0], 0, indent);
-                       }
-                       if (decl->child[1]) {
-                               smart_str_appends(str, " implements ");
-                               zend_ast_export_ex(str, decl->child[1], 0, indent);
-                       }
-                       smart_str_appends(str, " {\n");
-                       zend_ast_export_stmt(str, decl->child[2], indent + 1);
-                       zend_ast_export_indent(str, indent);
-                       smart_str_appends(str, "}\n");
+                       zend_ast_export_class_no_header(str, decl, indent);
+                       smart_str_appendc(str, '\n');
                        break;
 
                /* list nodes */
@@ -1344,10 +1349,20 @@ simple_list:
                        break;
                case ZEND_AST_NEW:
                        smart_str_appends(str, "new ");
-                       zend_ast_export_ns_name(str, ast->child[0], 0, indent);
-                       smart_str_appendc(str, '(');
-                       zend_ast_export_ex(str, ast->child[1], 0, indent);
-                       smart_str_appendc(str, ')');
+                       if (ast->child[0]->kind == ZEND_AST_CLASS) {
+                               smart_str_appends(str, "class");
+                               if (zend_ast_get_list(ast->child[1])->children) {
+                                       smart_str_appendc(str, '(');
+                                       zend_ast_export_ex(str, ast->child[1], 0, indent);
+                                       smart_str_appendc(str, ')');
+                               }
+                               zend_ast_export_class_no_header(str, (zend_ast_decl *) ast->child[0], indent);
+                       } else {
+                               zend_ast_export_ns_name(str, ast->child[0], 0, indent);
+                               smart_str_appendc(str, '(');
+                               zend_ast_export_ex(str, ast->child[1], 0, indent);
+                               smart_str_appendc(str, ')');
+                       }
                        break;
                case ZEND_AST_INSTANCEOF:
                        zend_ast_export_ex(str, ast->child[0], 0, indent);