From b196d4ae3ee80a947f3c4473ef4fea004da81cdd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 9 Apr 2021 14:33:34 +0200 Subject: [PATCH] Accept zend_string instead of zval in compile_filename --- Zend/zend_compile.h | 2 +- Zend/zend_execute.c | 43 +++++++++++++----------------------- Zend/zend_language_scanner.l | 14 +++--------- 3 files changed, 19 insertions(+), 40 deletions(-) diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 9e22837d615..8c4420667b0 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -816,7 +816,7 @@ struct _zend_arena; ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type); ZEND_API zend_op_array *compile_string(zend_string *source_string, const char *filename); -ZEND_API zend_op_array *compile_filename(int type, zval *filename); +ZEND_API zend_op_array *compile_filename(int type, zend_string *filename); ZEND_API zend_ast *zend_compile_string_to_ast( zend_string *code, struct _zend_arena **ast_arena, zend_string *filename); ZEND_API int zend_execute_scripts(int type, zval *retval, int file_count, ...); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index ee4ee4df45d..a5a81641ba0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -4212,20 +4212,13 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar #define ZEND_FAKE_OP_ARRAY ((zend_op_array*)(zend_intptr_t)-1) -static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval *inc_filename, int type) /* {{{ */ +static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval *inc_filename_zv, int type) /* {{{ */ { zend_op_array *new_op_array = NULL; - zval tmp_inc_filename; - - ZVAL_UNDEF(&tmp_inc_filename); - if (Z_TYPE_P(inc_filename) != IS_STRING) { - zend_string *tmp = zval_try_get_string_func(inc_filename); - - if (UNEXPECTED(!tmp)) { - return NULL; - } - ZVAL_STR(&tmp_inc_filename, tmp); - inc_filename = &tmp_inc_filename; + zend_string *tmp_inc_filename; + zend_string *inc_filename = zval_try_get_tmp_string(inc_filename_zv, &tmp_inc_filename); + if (UNEXPECTED(!inc_filename)) { + return NULL; } switch (type) { @@ -4234,7 +4227,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval zend_file_handle file_handle; zend_string *resolved_path; - resolved_path = zend_resolve_path(Z_STR_P(inc_filename)); + resolved_path = zend_resolve_path(inc_filename); if (EXPECTED(resolved_path)) { if (zend_hash_exists(&EG(included_files), resolved_path)) { new_op_array = ZEND_FAKE_OP_ARRAY; @@ -4243,14 +4236,14 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval } } else if (UNEXPECTED(EG(exception))) { break; - } else if (UNEXPECTED(strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename))) { + } else if (UNEXPECTED(strlen(ZSTR_VAL(inc_filename)) != ZSTR_LEN(inc_filename))) { zend_message_dispatcher( (type == ZEND_INCLUDE_ONCE) ? ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN, - Z_STRVAL_P(inc_filename)); + ZSTR_VAL(inc_filename)); break; } else { - resolved_path = zend_string_copy(Z_STR_P(inc_filename)); + resolved_path = zend_string_copy(inc_filename); } zend_stream_init_filename_ex(&file_handle, resolved_path); @@ -4264,9 +4257,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval zend_op_array *op_array = zend_compile_file(&file_handle, (type==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE)); zend_destroy_file_handle(&file_handle); zend_string_release_ex(resolved_path, 0); - if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) { - zval_ptr_dtor_str(&tmp_inc_filename); - } + zend_tmp_string_release(tmp_inc_filename); return op_array; } else { new_op_array = ZEND_FAKE_OP_ARRAY; @@ -4275,7 +4266,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval zend_message_dispatcher( (type == ZEND_INCLUDE_ONCE) ? ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN, - Z_STRVAL_P(inc_filename)); + ZSTR_VAL(inc_filename)); } zend_destroy_file_handle(&file_handle); zend_string_release_ex(resolved_path, 0); @@ -4283,29 +4274,25 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval break; case ZEND_INCLUDE: case ZEND_REQUIRE: - if (UNEXPECTED(strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename))) { + if (UNEXPECTED(strlen(ZSTR_VAL(inc_filename)) != ZSTR_LEN(inc_filename))) { zend_message_dispatcher( (type == ZEND_INCLUDE) ? ZMSG_FAILED_INCLUDE_FOPEN : ZMSG_FAILED_REQUIRE_FOPEN, - Z_STRVAL_P(inc_filename)); + ZSTR_VAL(inc_filename)); break; } new_op_array = compile_filename(type, inc_filename); break; case ZEND_EVAL: { char *eval_desc = zend_make_compiled_string_description("eval()'d code"); - zend_string *code = zval_get_string(inc_filename); - new_op_array = zend_compile_string(code, eval_desc); - zend_string_release(code); + new_op_array = zend_compile_string(inc_filename, eval_desc); efree(eval_desc); } break; EMPTY_SWITCH_DEFAULT_CASE() } - if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) { - zval_ptr_dtor_str(&tmp_inc_filename); - } + zend_tmp_string_release(tmp_inc_filename); return new_op_array; } /* }}} */ diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index c8417ecee32..83e552b26b3 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -696,23 +696,18 @@ ZEND_API zend_ast *zend_compile_string_to_ast( return ast; } -zend_op_array *compile_filename(int type, zval *filename) +zend_op_array *compile_filename(int type, zend_string *filename) { zend_file_handle file_handle; - zval tmp; zend_op_array *retval; zend_string *opened_path = NULL; - if (Z_TYPE_P(filename) != IS_STRING) { - ZVAL_STR(&tmp, zval_get_string(filename)); - filename = &tmp; - } - zend_stream_init_filename_ex(&file_handle, Z_STR_P(filename)); + zend_stream_init_filename_ex(&file_handle, filename); retval = zend_compile_file(&file_handle, type); if (retval && file_handle.handle.stream.handle) { if (!file_handle.opened_path) { - file_handle.opened_path = opened_path = zend_string_copy(Z_STR_P(filename)); + file_handle.opened_path = opened_path = zend_string_copy(filename); } zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path); @@ -723,9 +718,6 @@ zend_op_array *compile_filename(int type, zval *filename) } zend_destroy_file_handle(&file_handle); - if (UNEXPECTED(filename == &tmp)) { - zval_ptr_dtor(&tmp); - } return retval; }