diff options
author | Felipe Pena <felipe@php.net> | 2010-07-12 20:11:35 +0000 |
---|---|---|
committer | Felipe Pena <felipe@php.net> | 2010-07-12 20:11:35 +0000 |
commit | 6bed6c114e4ea2f27ebef3f40db77c07e88190db (patch) | |
tree | 2bc5aed2d789b687db1d0c66e8313718c1cc1051 | |
parent | 087117419b0a5838b51c19f72da9ce427ccb036d (diff) | |
download | php-git-6bed6c114e4ea2f27ebef3f40db77c07e88190db.tar.gz |
- Fixed SIGSEGV when E_PARSE occurred in zend_eval_stringl
-rw-r--r-- | Zend/zend_compile.c | 18 | ||||
-rw-r--r-- | Zend/zend_language_parser.y | 1 | ||||
-rw-r--r-- | Zend/zend_language_scanner_defs.h | 2 |
3 files changed, 16 insertions, 5 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 5868aaf5b2..b502deb254 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6109,7 +6109,7 @@ int zend_register_auto_global(const char *name, uint name_len, zend_auto_global_ int zendparse(TSRMLS_D) /* {{{ */ { - int token, lineno = 0, halting = 0; + int token, lineno = 0, halting = 0, old_exit_status; void *pParser; if ((pParser = zend_lang_parseAlloc(malloc)) == NULL) { @@ -6117,6 +6117,8 @@ int zendparse(TSRMLS_D) /* {{{ */ return 1; } + old_exit_status = EG(exit_status); + EG(exit_status) = 0; lineno = CG(zend_lineno); while (1) { @@ -6164,15 +6166,25 @@ again: } zend_lang_parse(pParser, token, zendlval TSRMLS_CC); CG(zend_lineno) = lineno; + if (token == 0) { break; - } else if (halting == 1 && token == T_SEMICOLON) { + } else if (EG(exit_status) == 255 || (halting == 1 && token == T_SEMICOLON)) { + /* Handles E_PARSE and __HALT_COMPILER(); */ zend_lang_parse(pParser, 0, zendlval TSRMLS_CC); + if (EG(exit_status) == 255) { + goto end_parse; + } break; } } +end_parse: zend_lang_parseFree(pParser, free); - + if (EG(exit_status) == 255) { + /* We got an E_PARSE */ + return 1; + } + EG(exit_status) = old_exit_status; return 0; } /* }}} */ diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 4455c44903..bf7334186f 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -37,7 +37,6 @@ %syntax_error { zend_error(E_PARSE, "syntax error, unexpected '%.*s'", LANG_SCNG(yy_leng), LANG_SCNG(yy_text)); - zend_bailout(); } %stack_overflow { diff --git a/Zend/zend_language_scanner_defs.h b/Zend/zend_language_scanner_defs.h index a1e16c4410..e54e1f251b 100644 --- a/Zend/zend_language_scanner_defs.h +++ b/Zend/zend_language_scanner_defs.h @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Mon Jul 12 14:03:13 2010 */ +/* Generated by re2c 0.13.5 on Mon Jul 12 16:24:11 2010 */ #line 3 "Zend/zend_language_scanner_defs.h" enum YYCONDTYPE { |