diff options
-rw-r--r-- | Zend/zend-scanner.l | 41 | ||||
-rw-r--r-- | Zend/zend_compile.c | 1 | ||||
-rw-r--r-- | Zend/zend_globals.h | 1 | ||||
-rw-r--r-- | Zend/zend_highlight.c | 14 |
4 files changed, 36 insertions, 21 deletions
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 <stdarg.h> #endif +#if HAVE_UNISTD_H +#include <unistd.h> +#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; i<file_count; i++) { file_handle = va_arg(files, zend_file_handle *); if (!file_handle) { @@ -265,17 +269,18 @@ ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count, break; } else { CG(active_op_array) = op_array; - if (zendparse(CLS_C)==1) { + compiler_result = zendparse(CLS_C); + zend_close_file_handle(file_handle); + restore_lexical_state(&original_lex_state CLS_CC); + CG(active_op_array) = original_active_op_array; + if (compiler_result==1) { /* parser error */ + CG(unclean_shutdown) = 1; retval = NULL; break; - } else { - zend_close_file_handle(file_handle); - restore_lexical_state(&original_lex_state CLS_CC); - CG(active_op_array) = original_active_op_array; - retval = op_array; } } } + if (retval) { pass_two(op_array); if (mark_as_ref) { @@ -335,7 +340,12 @@ zend_op_array *compile_string(zval *source_string CLS_DC) zend_op_array *original_active_op_array = CG(active_op_array); zend_op_array *retval; zval tmp; + int compiler_result; + if (source_string->value.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; |