From 9baad804595a97e47baf3f75836fcc9596f2351e Mon Sep 17 00:00:00 2001 From: Zeev Suraski Date: Sat, 4 Dec 1999 13:26:57 +0000 Subject: [PATCH] - Break the zend->PHP dependency introduced by the .php extension for use(), by providing an API - Enable Stig's patch for use() extensions (it wasn't refered to by the parser) - Fix a memory leak in that code --- Zend/zend-parser.y | 4 ++-- Zend/zend-scanner.l | 36 ++++++++++++++++++++---------------- Zend/zend.c | 1 + Zend/zend.h | 7 ++++--- Zend/zend_compile.c | 2 +- Zend/zend_compile.h | 5 +++-- 6 files changed, 31 insertions(+), 24 deletions(-) diff --git a/Zend/zend-parser.y b/Zend/zend-parser.y index b8eb3239da..ec23addf7d 100644 --- a/Zend/zend-parser.y +++ b/Zend/zend-parser.y @@ -180,8 +180,8 @@ statement: | T_ECHO echo_expr_list ';' | T_INLINE_HTML { do_echo(&$1 CLS_CC); } | expr ';' { do_free(&$1 CLS_CC); } - | T_REQUIRE expr ';' { if ($2.op_type==IS_CONST && $2.u.constant.type==IS_STRING) { require_filename($2.u.constant.value.str.val, 0 CLS_CC); zval_dtor(&$2.u.constant); } else { do_include_or_eval(ZEND_INCLUDE, &$$, &$2 CLS_CC); } } - | T_USE use_filename ';' { require_filename($2.u.constant.value.str.val, 1 CLS_CC); zval_dtor(&$2.u.constant); } + | T_REQUIRE expr ';' { if ($2.op_type==IS_CONST && $2.u.constant.type==IS_STRING) { require_filename($2.u.constant.value.str.val CLS_CC); zval_dtor(&$2.u.constant); } else { do_include_or_eval(ZEND_INCLUDE, &$$, &$2 CLS_CC); } } + | T_USE use_filename ';' { use_filename($2.u.constant.value.str.val, $2.u.constant.value.str.len CLS_CC); zval_dtor(&$2.u.constant); } | T_UNSET '(' r_cvar ')' ';' { do_unset(&$3 CLS_CC); } | T_FOREACH '(' expr T_AS { do_foreach_begin(&$1, &$3, &$2, &$4 CLS_CC); } w_cvar foreach_optional_arg ')' { do_foreach_cont(&$6, &$7, &$4 CLS_CC); } foreach_statement { do_foreach_end(&$1, &$2 CLS_CC); } | ';' /* empty statement */ diff --git a/Zend/zend-scanner.l b/Zend/zend-scanner.l index c228a9fd14..534bfe746b 100644 --- a/Zend/zend-scanner.l +++ b/Zend/zend-scanner.l @@ -201,6 +201,12 @@ ZEND_API void zend_open_file_dtor(zend_file_handle *fh) break; #endif } + if (fh->opened_path) { + free(fh->opened_path); + } + if (fh->free_filename && fh->filename) { + efree(fh->filename); + } } @@ -383,6 +389,7 @@ zend_op_array *compile_filename(zval *filename, zend_bool unique CLS_DC) filename = &tmp; } file_handle.filename = filename->value.str.val; + file_handle.free_filename = 0; file_handle.type = ZEND_HANDLE_FILENAME; file_handle.opened_path = NULL; retval = zend_compile_files(1 CLS_CC, 1, &file_handle); @@ -467,13 +474,14 @@ zend_op_array *compile_string(zval *source_string CLS_DC) BEGIN_EXTERN_C() -int require_filename(char *filename, zend_bool unique CLS_DC) +int require_filename(char *filename CLS_DC) { zend_file_handle file_handle; file_handle.type = ZEND_HANDLE_FILENAME; file_handle.filename = filename; - if (require_file(&file_handle, unique CLS_CC)==FAILURE) { + file_handle.free_filename = 0; + if (require_file(&file_handle, 0 CLS_CC)==FAILURE) { zend_bailout(); return FAILURE; /* will never get here */ } @@ -481,21 +489,19 @@ int require_filename(char *filename, zend_bool unique CLS_DC) } -int use_filename(char *filename, zend_bool unique CLS_DC) +int use_filename(char *filename, uint filename_length CLS_DC) { zend_file_handle file_handle; - int filenamelen; - char *newfile; - filenamelen = strlen(filename); - newfile = (char *) emalloc(filenamelen + 5); - strcpy(newfile, filename); - strcpy(newfile+filenamelen, ".php"); - newfile[filenamelen+4] = '\0'; + file_handle.filename = (char *) emalloc(filename_length + zend_uv.import_use_extension_length); + memcpy(file_handle.filename, filename, filename_length); + memcpy(file_handle.filename+filename_length, zend_uv.import_use_extension, zend_uv.import_use_extension_length); + file_handle.filename[filename_length+zend_uv.import_use_extension_length] = 0; + file_handle.free_filename = 1; file_handle.type = ZEND_HANDLE_FILENAME; - file_handle.filename = newfile; - if (require_file(&file_handle, unique CLS_CC)==FAILURE) { + if (require_file(&file_handle, 1 CLS_CC)==FAILURE) { + efree(file_handle.filename); zend_bailout(); return FAILURE; /* will never get here */ } @@ -515,15 +521,12 @@ int require_file(zend_file_handle *file_handle, zend_bool unique CLS_DC) } if (file_handle->opened_path) { if (unique) { - zend_bool exists=1; - - if (zend_hash_add(&CG(used_files), file_handle->opened_path, strlen(file_handle->opened_path)+1, &exists, sizeof(zend_bool), NULL)==FAILURE) { + if (zend_hash_add(&CG(used_files), file_handle->opened_path, strlen(file_handle->opened_path)+1, file_handle, sizeof(zend_file_handle), NULL)==FAILURE) { zend_close_file_handle(file_handle CLS_CC); restore_lexical_state(&original_lex_state CLS_CC); return SUCCESS; } } - free(file_handle->opened_path); } compiler_result = zendparse(CLS_C); zend_close_file_handle(file_handle CLS_CC); @@ -543,6 +546,7 @@ int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlight file_handle.type = ZEND_HANDLE_FILENAME; file_handle.filename = filename; + file_handle.free_filename = 0; file_handle.opened_path = NULL; save_lexical_state(&original_lex_state CLS_CC); if (open_file_for_scanning(&file_handle CLS_CC)==FAILURE) { diff --git a/Zend/zend.c b/Zend/zend.c index 34889f76f9..b62eec41b1 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -377,6 +377,7 @@ void zend_shutdown() void zend_set_utility_values(zend_utility_values *utility_values) { zend_uv = *utility_values; + zend_uv.import_use_extension_length = strlen(zend_uv.import_use_extension); } diff --git a/Zend/zend.h b/Zend/zend.h index c056a8a12e..2129970352 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -189,6 +189,8 @@ typedef struct _zend_utility_functions { typedef struct _zend_utility_values { unsigned char short_tags; unsigned char asp_tags; + char *import_use_extension; + uint import_use_extension_length; } zend_utility_values; @@ -242,13 +244,12 @@ extern ZEND_API void (*zend_block_interruptions)(void); extern ZEND_API void (*zend_unblock_interruptions)(void); extern ZEND_API void (*zend_message_dispatcher)(long message, void *data); extern ZEND_API int (*zend_get_ini_entry)(char *name, uint name_length, zval *contents); -END_EXTERN_C() - - + void zenderror(char *error); extern ZEND_API zend_class_entry zend_standard_class_def; extern zend_utility_values zend_uv; +END_EXTERN_C() #define ZEND_UV(name) (zend_uv.name) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index d7d2aec69c..247ad5567a 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -95,7 +95,7 @@ void init_compiler(CLS_D ELS_DC) init_resource_list(ELS_C); CG(unclean_shutdown) = 0; zend_llist_init(&CG(open_files), sizeof(zend_file_handle), (void (*)(void *)) zend_open_file_dtor, 0); - zend_hash_init(&CG(used_files), 5, NULL, NULL, 0); + zend_hash_init(&CG(used_files), 5, NULL, NULL , 0); } diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index c3ae28421e..18748fdabb 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -177,6 +177,7 @@ typedef struct _zend_file_handle { istream *is; #endif } handle; + zend_bool free_filename; } zend_file_handle; @@ -346,8 +347,8 @@ void do_extended_fcall_end(CLS_D); /* helper functions in zend-scanner.l */ BEGIN_EXTERN_C() ZEND_API int require_file(zend_file_handle *file_handle, zend_bool unique CLS_DC); -ZEND_API int require_filename(char *filename, zend_bool unique CLS_DC); -ZEND_API int use_filename(char *filename, zend_bool unique CLS_DC); +ZEND_API int require_filename(char *filename CLS_DC); +ZEND_API int use_filename(char *filename, uint filename_length CLS_DC); ZEND_API zend_op_array *compile_files(int mark_as_ref CLS_DC, int file_count, ...); ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count, va_list files); ZEND_API zend_op_array *compile_string(zval *source_string CLS_DC); -- 2.40.0