diff options
| -rw-r--r-- | Zend/zend-parser.y | 4 | ||||
| -rw-r--r-- | Zend/zend-scanner.l | 36 | ||||
| -rw-r--r-- | Zend/zend.c | 1 | ||||
| -rw-r--r-- | Zend/zend.h | 7 | ||||
| -rw-r--r-- | Zend/zend_compile.c | 2 | ||||
| -rw-r--r-- | 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);	 | 
