summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Pena <felipe@php.net>2010-07-12 20:11:35 +0000
committerFelipe Pena <felipe@php.net>2010-07-12 20:11:35 +0000
commit6bed6c114e4ea2f27ebef3f40db77c07e88190db (patch)
tree2bc5aed2d789b687db1d0c66e8313718c1cc1051
parent087117419b0a5838b51c19f72da9ce427ccb036d (diff)
downloadphp-git-6bed6c114e4ea2f27ebef3f40db77c07e88190db.tar.gz
- Fixed SIGSEGV when E_PARSE occurred in zend_eval_stringl
-rw-r--r--Zend/zend_compile.c18
-rw-r--r--Zend/zend_language_parser.y1
-rw-r--r--Zend/zend_language_scanner_defs.h2
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 {