Skip to content

Commit 9baad80

Browse files
committed
- 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
1 parent da5464b commit 9baad80

File tree

6 files changed

+31
-24
lines changed

6 files changed

+31
-24
lines changed

Zend/zend-parser.y

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,8 @@ statement:
180180
| T_ECHO echo_expr_list ';'
181181
| T_INLINE_HTML { do_echo(&$1 CLS_CC); }
182182
| expr ';' { do_free(&$1 CLS_CC); }
183-
| 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); } }
184-
| T_USE use_filename ';' { require_filename($2.u.constant.value.str.val, 1 CLS_CC); zval_dtor(&$2.u.constant); }
183+
| 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); } }
184+
| 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); }
185185
| T_UNSET '(' r_cvar ')' ';' { do_unset(&$3 CLS_CC); }
186186
| 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); }
187187
| ';' /* empty statement */

Zend/zend-scanner.l

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,12 @@ ZEND_API void zend_open_file_dtor(zend_file_handle *fh)
201201
break;
202202
#endif
203203
}
204+
if (fh->opened_path) {
205+
free(fh->opened_path);
206+
}
207+
if (fh->free_filename && fh->filename) {
208+
efree(fh->filename);
209+
}
204210
}
205211

206212

@@ -383,6 +389,7 @@ zend_op_array *compile_filename(zval *filename, zend_bool unique CLS_DC)
383389
filename = &tmp;
384390
}
385391
file_handle.filename = filename->value.str.val;
392+
file_handle.free_filename = 0;
386393
file_handle.type = ZEND_HANDLE_FILENAME;
387394
file_handle.opened_path = NULL;
388395
retval = zend_compile_files(1 CLS_CC, 1, &file_handle);
@@ -467,35 +474,34 @@ zend_op_array *compile_string(zval *source_string CLS_DC)
467474

468475

469476
BEGIN_EXTERN_C()
470-
int require_filename(char *filename, zend_bool unique CLS_DC)
477+
int require_filename(char *filename CLS_DC)
471478
{
472479
zend_file_handle file_handle;
473480

474481
file_handle.type = ZEND_HANDLE_FILENAME;
475482
file_handle.filename = filename;
476-
if (require_file(&file_handle, unique CLS_CC)==FAILURE) {
483+
file_handle.free_filename = 0;
484+
if (require_file(&file_handle, 0 CLS_CC)==FAILURE) {
477485
zend_bailout();
478486
return FAILURE; /* will never get here */
479487
}
480488
return SUCCESS;
481489
}
482490

483491

484-
int use_filename(char *filename, zend_bool unique CLS_DC)
492+
int use_filename(char *filename, uint filename_length CLS_DC)
485493
{
486494
zend_file_handle file_handle;
487-
int filenamelen;
488-
char *newfile;
489495

490-
filenamelen = strlen(filename);
491-
newfile = (char *) emalloc(filenamelen + 5);
492-
strcpy(newfile, filename);
493-
strcpy(newfile+filenamelen, ".php");
494-
newfile[filenamelen+4] = '\0';
496+
file_handle.filename = (char *) emalloc(filename_length + zend_uv.import_use_extension_length);
497+
memcpy(file_handle.filename, filename, filename_length);
498+
memcpy(file_handle.filename+filename_length, zend_uv.import_use_extension, zend_uv.import_use_extension_length);
499+
file_handle.filename[filename_length+zend_uv.import_use_extension_length] = 0;
500+
file_handle.free_filename = 1;
495501

496502
file_handle.type = ZEND_HANDLE_FILENAME;
497-
file_handle.filename = newfile;
498-
if (require_file(&file_handle, unique CLS_CC)==FAILURE) {
503+
if (require_file(&file_handle, 1 CLS_CC)==FAILURE) {
504+
efree(file_handle.filename);
499505
zend_bailout();
500506
return FAILURE; /* will never get here */
501507
}
@@ -515,15 +521,12 @@ int require_file(zend_file_handle *file_handle, zend_bool unique CLS_DC)
515521
}
516522
if (file_handle->opened_path) {
517523
if (unique) {
518-
zend_bool exists=1;
519-
520-
if (zend_hash_add(&CG(used_files), file_handle->opened_path, strlen(file_handle->opened_path)+1, &exists, sizeof(zend_bool), NULL)==FAILURE) {
524+
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) {
521525
zend_close_file_handle(file_handle CLS_CC);
522526
restore_lexical_state(&original_lex_state CLS_CC);
523527
return SUCCESS;
524528
}
525529
}
526-
free(file_handle->opened_path);
527530
}
528531
compiler_result = zendparse(CLS_C);
529532
zend_close_file_handle(file_handle CLS_CC);
@@ -543,6 +546,7 @@ int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlight
543546

544547
file_handle.type = ZEND_HANDLE_FILENAME;
545548
file_handle.filename = filename;
549+
file_handle.free_filename = 0;
546550
file_handle.opened_path = NULL;
547551
save_lexical_state(&original_lex_state CLS_CC);
548552
if (open_file_for_scanning(&file_handle CLS_CC)==FAILURE) {

Zend/zend.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ void zend_shutdown()
377377
void zend_set_utility_values(zend_utility_values *utility_values)
378378
{
379379
zend_uv = *utility_values;
380+
zend_uv.import_use_extension_length = strlen(zend_uv.import_use_extension);
380381
}
381382

382383

Zend/zend.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ typedef struct _zend_utility_functions {
189189
typedef struct _zend_utility_values {
190190
unsigned char short_tags;
191191
unsigned char asp_tags;
192+
char *import_use_extension;
193+
uint import_use_extension_length;
192194
} zend_utility_values;
193195

194196

@@ -242,13 +244,12 @@ extern ZEND_API void (*zend_block_interruptions)(void);
242244
extern ZEND_API void (*zend_unblock_interruptions)(void);
243245
extern ZEND_API void (*zend_message_dispatcher)(long message, void *data);
244246
extern ZEND_API int (*zend_get_ini_entry)(char *name, uint name_length, zval *contents);
245-
END_EXTERN_C()
246-
247-
247+
248248
void zenderror(char *error);
249249

250250
extern ZEND_API zend_class_entry zend_standard_class_def;
251251
extern zend_utility_values zend_uv;
252+
END_EXTERN_C()
252253

253254
#define ZEND_UV(name) (zend_uv.name)
254255

Zend/zend_compile.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ void init_compiler(CLS_D ELS_DC)
9595
init_resource_list(ELS_C);
9696
CG(unclean_shutdown) = 0;
9797
zend_llist_init(&CG(open_files), sizeof(zend_file_handle), (void (*)(void *)) zend_open_file_dtor, 0);
98-
zend_hash_init(&CG(used_files), 5, NULL, NULL, 0);
98+
zend_hash_init(&CG(used_files), 5, NULL, NULL , 0);
9999
}
100100

101101

Zend/zend_compile.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ typedef struct _zend_file_handle {
177177
istream *is;
178178
#endif
179179
} handle;
180+
zend_bool free_filename;
180181
} zend_file_handle;
181182

182183

@@ -346,8 +347,8 @@ void do_extended_fcall_end(CLS_D);
346347
/* helper functions in zend-scanner.l */
347348
BEGIN_EXTERN_C()
348349
ZEND_API int require_file(zend_file_handle *file_handle, zend_bool unique CLS_DC);
349-
ZEND_API int require_filename(char *filename, zend_bool unique CLS_DC);
350-
ZEND_API int use_filename(char *filename, zend_bool unique CLS_DC);
350+
ZEND_API int require_filename(char *filename CLS_DC);
351+
ZEND_API int use_filename(char *filename, uint filename_length CLS_DC);
351352
ZEND_API zend_op_array *compile_files(int mark_as_ref CLS_DC, int file_count, ...);
352353
ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count, va_list files);
353354
ZEND_API zend_op_array *compile_string(zval *source_string CLS_DC);

0 commit comments

Comments
 (0)