From: Nikita Popov Date: Tue, 29 Mar 2016 17:29:19 +0000 (+0200) Subject: Fixed bug #71922 X-Git-Tag: php-7.0.6RC1~51 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ed06d130f70691cb50bed9dc7b9db38970a9d408;p=php Fixed bug #71922 --- diff --git a/NEWS b/NEWS index 4af909d23f..abf70d04c1 100644 --- 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 index 0000000000..986254cab7 --- /dev/null +++ b/Zend/tests/bug71922.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #71922: Crash on assert(new class{}); +--INI-- +zend.assertions=1 +assert.exception=1 +--FILE-- +getMessage(), "\n"; +} + +?> +--EXPECT-- +Assertion failure: assert(0 && new class { +} && new class(42) extends stdclass { +}) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 6540f82c6b..cfcd636269 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -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);