From: Zeev Suraski Date: Tue, 11 May 1999 17:50:37 +0000 (+0000) Subject: * Fix a bug that occured in case of parse errors. We need to restore the lexical... X-Git-Tag: BEFORE_PHP4_APACHE_MODULE_CHANGE~64 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=473d1d7cf13f7cd76a2d515fbde62694c2f504fd;p=php * Fix a bug that occured in case of parse errors. We need to restore the lexical state even if the compilation failed. --- diff --git a/Zend/zend-scanner.l b/Zend/zend-scanner.l index 6eadc7374c..a74148fc8c 100644 --- a/Zend/zend-scanner.l +++ b/Zend/zend-scanner.l @@ -58,6 +58,10 @@ #include #endif +#if HAVE_UNISTD_H +#include +#endif + #ifdef ZTS #define YY_DECL int ZendFlexLexer::lex_scan(zval *zendlval CLS_DC) #else @@ -176,8 +180,6 @@ ZEND_API void zend_close_file_handle(zend_file_handle *file_handle) ZEND_API inline int open_file_for_scanning(zend_file_handle *file_handle CLS_DC) { #ifndef ZTS - YY_BUFFER_STATE buffer_state = YY_CURRENT_BUFFER; - switch (file_handle->type) { case ZEND_HANDLE_FILENAME: file_handle->handle.fp = zend_fopen(file_handle->filename); @@ -247,10 +249,12 @@ ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count, zend_op_array *retval=NULL; zend_file_handle *file_handle; int i; + int compiler_result; init_op_array(op_array, INITIAL_OP_ARRAY_SIZE); save_lexical_state(&original_lex_state CLS_CC); + retval = op_array; /* success oriented */ for (i=0; ivalue.str.len==0) { + efree(op_array); + return NULL; + } tmp = *source_string; zval_copy_ctor(&tmp); convert_to_string(&tmp); @@ -355,19 +365,20 @@ zend_op_array *compile_string(zval *source_string CLS_DC) #else CG(ZFL)->BeginState(IN_SCRIPTING); #endif - if (zendparse(CLS_C)==1) { + compiler_result = zendparse(CLS_C); + restore_lexical_state(&original_lex_state CLS_CC); + CG(active_op_array) = original_active_op_array; + + if (compiler_result==1) { + CG(unclean_shutdown)=1; retval = NULL; } else { pass_two(op_array); pass_include_eval(op_array); - restore_lexical_state(&original_lex_state CLS_CC); - CG(active_op_array) = original_active_op_array; retval = op_array; } } - zval_dtor(&tmp); - return retval; } @@ -392,7 +403,9 @@ int require_file(zend_file_handle *file_handle CLS_DC) zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename); return FAILURE; } - zendparse(CLS_C); + if (zendparse(CLS_C)==1) { + CG(unclean_shutdown) = 1; + } zend_close_file_handle(file_handle); restore_lexical_state(&original_lex_state CLS_CC); return SUCCESS; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 64a6b3926e..bb4d1ee2aa 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -66,6 +66,7 @@ void init_compiler(CLS_D ELS_DC) CG(handle_op_arrays) = 1; zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_request_startup); init_resource_list(ELS_C); + CG(unclean_shutdown) = 0; } diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 73622e582d..a2036ac543 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -146,6 +146,7 @@ struct _zend_compiler_globals { unsigned char extended_info; /* generate extension information for debugger/profiler */ unsigned char handle_op_arrays; /* run op_arrays through op_array handlers */ + unsigned char unclean_shutdown; #ifdef ZTS #ifdef __cplusplus ZendFlexLexer *ZFL; diff --git a/Zend/zend_highlight.c b/Zend/zend_highlight.c index 0fc0b8cbcd..e80fac449b 100644 --- a/Zend/zend_highlight.c +++ b/Zend/zend_highlight.c @@ -138,13 +138,13 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini if (token.type == IS_STRING) { switch (token_type) { - case T_OPEN_TAG: - case T_CLOSE_TAG: - case T_WHITESPACE: - break; - default: - efree(token.value.str.val); - break; + case T_OPEN_TAG: + case T_CLOSE_TAG: + case T_WHITESPACE: + break; + default: + efree(token.value.str.val); + break; } } token.type = 0;