From 3433bd5943e458a952da6d9d42fea2a1f36dc032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Fri, 24 Apr 2026 14:58:41 +0200 Subject: [PATCH 1/8] zend_string: Replace some macros by inline functions (#21855) --- Zend/zend_string.h | 52 ++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 430f4dec02e2..d2b382390009 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -71,33 +71,49 @@ END_EXTERN_C() /*---*/ -#define ZSTR_IS_INTERNED(s) (GC_FLAGS(s) & IS_STR_INTERNED) -#define ZSTR_IS_VALID_UTF8(s) (GC_FLAGS(s) & IS_STR_VALID_UTF8) +static zend_always_inline bool ZSTR_IS_INTERNED(const zend_string *s) { + return GC_FLAGS(s) & IS_STR_INTERNED; +} + +static inline bool ZSTR_IS_VALID_UTF8(const zend_string *s) { + return GC_FLAGS(s) & IS_STR_VALID_UTF8; +} /* These are properties, encoded as flags, that will hold on the resulting string * after concatenating two strings that have these property. * Example: concatenating two UTF-8 strings yields another UTF-8 string. */ #define ZSTR_COPYABLE_CONCAT_PROPERTIES (IS_STR_VALID_UTF8) -#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s) (GC_FLAGS(s) & ZSTR_COPYABLE_CONCAT_PROPERTIES) -/* This macro returns the copyable concat properties which hold on both strings. */ -#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(s1, s2) (GC_FLAGS(s1) & GC_FLAGS(s2) & ZSTR_COPYABLE_CONCAT_PROPERTIES) +static inline uint32_t ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(const zend_string *s) { + return GC_FLAGS(s) & ZSTR_COPYABLE_CONCAT_PROPERTIES; +} -#define ZSTR_COPY_CONCAT_PROPERTIES(out, in) do { \ - zend_string *_out = (out); \ - uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES((in)); \ - GC_ADD_FLAGS(_out, properties); \ -} while (0) +/* This function returns the copyable concat properties which hold on both strings. */ +static inline uint32_t ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(const zend_string *s1, const zend_string *s2) { + return ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s1) & ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s2); +} -#define ZSTR_COPY_CONCAT_PROPERTIES_BOTH(out, in1, in2) do { \ - zend_string *_out = (out); \ - uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH((in1), (in2)); \ - GC_ADD_FLAGS(_out, properties); \ -} while (0) +static inline void ZSTR_COPY_CONCAT_PROPERTIES(zend_string *out, const zend_string *in) { + uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(in); + GC_ADD_FLAGS(out, properties); +} -#define ZSTR_EMPTY_ALLOC() zend_empty_string -#define ZSTR_CHAR(c) zend_one_char_string[c] -#define ZSTR_KNOWN(idx) zend_known_strings[idx] +static inline void ZSTR_COPY_CONCAT_PROPERTIES_BOTH(zend_string *out, const zend_string *in1, const zend_string *in2) { + uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(in1, in2); + GC_ADD_FLAGS(out, properties); +} + +static zend_always_inline zend_string *ZSTR_EMPTY_ALLOC(void) { + return zend_empty_string; +} + +static zend_always_inline zend_string *ZSTR_CHAR(unsigned char c) { + return zend_one_char_string[c]; +} + +static zend_always_inline zend_string *ZSTR_KNOWN(size_t idx) { + return zend_known_strings[idx]; +} #define _ZSTR_HEADER_SIZE XtOffsetOf(zend_string, val) From 7d166a2f8ebb4bb55e6b3c6e4e0e512c041d0373 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 24 Apr 2026 14:08:13 +0100 Subject: [PATCH 2/8] ext/phar: no need to free error if operation is successful (#21859) This could also be seen from the lack of coverage on CodeCov as these are impossible branches to reach. --- ext/phar/dirstream.c | 4 ---- ext/phar/phar_object.c | 11 ----------- ext/phar/stream.c | 6 ------ 3 files changed, 21 deletions(-) diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c index bdd90851fecc..4bef14dfe6ae 100644 --- a/ext/phar/dirstream.c +++ b/ext/phar/dirstream.c @@ -287,10 +287,6 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path, return NULL; } - if (error) { - efree(error); - } - if (zend_string_equals(resource->path, ZSTR_CHAR('/'))) { /* root directory requested */ php_url_free(resource); diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index c07ff93b951f..bc55c175f7ba 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -1655,9 +1655,6 @@ static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */ return ZEND_HASH_APPLY_STOP; } else { - if (error) { - efree(error); - } /* convert to PHAR_UFP */ if (data->internal_file->fp_type == PHAR_MOD) { php_stream_close(data->internal_file->fp); @@ -3603,10 +3600,6 @@ static void phar_add_file(phar_archive_data **pphar, zend_string *file_name, con } goto finish; } else { - if (error) { - efree(error); - } - if (!data->internal_file->is_dir) { size_t contents_len = 0; if (content) { @@ -3683,10 +3676,6 @@ static void phar_mkdir(phar_archive_data **pphar, zend_string *dir_name) return; } else { - if (error) { - efree(error); - } - /* check for copy on write */ if (data->phar != *pphar) { *pphar = data->phar; diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 1d9229c44621..f49bc5e2deba 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -200,9 +200,6 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha php_url_free(resource); return NULL; } - if (error) { - efree(error); - } fpf = php_stream_alloc(&phar_ops, idata, NULL, mode); php_url_free(resource); efree(internal_file); @@ -706,9 +703,6 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int php_url_free(resource); return 0; } - if (error) { - efree(error); - } if (idata->internal_file->fp_refcount > 1) { /* more than just our fp resource is open for this file */ php_stream_wrapper_log_error(wrapper, options, "phar error: \"%s\" in phar \"%s\", has open file pointers, cannot unlink", internal_file, ZSTR_VAL(resource->host)); From 530276ab3fc6d34bf231d52d2a93ce55996e0550 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 23 Apr 2026 20:12:31 +0100 Subject: [PATCH 3/8] ext/phar: reorganize if statements to remove gotos in phar_get_archive() And have a linear code flow that is easier to reason --- ext/phar/util.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/ext/phar/util.c b/ext/phar/util.c index efab7f9edab6..41f9fce546e8 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -997,16 +997,21 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz return SUCCESS; } - if (alias && alias_len && PHAR_G(last_phar) && alias_len == PHAR_G(last_alias_len) && !memcmp(alias, PHAR_G(last_alias), alias_len)) { - fd = PHAR_G(last_phar); - fd_ptr = fd; - goto alias_success; - } - if (alias && alias_len) { - fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len); + /* If the alias stored in the last_phar cache matches, just use it directly */ + if (PHAR_G(last_phar) && alias_len == PHAR_G(last_alias_len) && !memcmp(alias, PHAR_G(last_alias), alias_len)) { + fd = PHAR_G(last_phar); + fd_ptr = fd; + } else { + fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len); + } + + /* If we didn't find the alias, check in the cached manifest to see if we can find it */ + if (!fd_ptr && PHAR_G(manifest_cached)) { + fd_ptr = zend_hash_str_find_ptr(&cached_alias, alias, alias_len); + } + if (fd_ptr) { -alias_success: if (!zend_string_equals_cstr(fd_ptr->fname, fname, fname_len)) { if (error) { spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, ZSTR_VAL(fd_ptr->fname), fname); @@ -1029,10 +1034,6 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz return SUCCESS; } - - if (PHAR_G(manifest_cached) && NULL != (fd_ptr = zend_hash_str_find_ptr(&cached_alias, alias, alias_len))) { - goto alias_success; - } } my_realpath = NULL; @@ -1129,8 +1130,13 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz } fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len); + + /* If we didn't find the path in the fname map, check in the cached manifest to see if we can find it */ + if (!fd_ptr && PHAR_G(manifest_cached)) { + fd_ptr = zend_hash_str_find_ptr(&cached_phars, fname, fname_len); + } + if (fd_ptr) { -realpath_success: *archive = fd_ptr; fd = fd_ptr; @@ -1148,10 +1154,6 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz return SUCCESS; } - if (PHAR_G(manifest_cached) && NULL != (fd_ptr = zend_hash_str_find_ptr(&cached_phars, fname, fname_len))) { - goto realpath_success; - } - efree(my_realpath); } From 3a9d7b53e05ccf456ef917b1cd9a3fc36bd3d380 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 23 Apr 2026 20:27:33 +0100 Subject: [PATCH 4/8] ext/phar: refactor logic after expand_filepath() call in phar_get_archive() We don't need to be assigning the realpath to fname, we can just use it directly. This also makes the efree(my_realpath) call not seem completely random. --- ext/phar/util.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/ext/phar/util.c b/ext/phar/util.c index 41f9fce546e8..48ef45c9b724 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -963,7 +963,6 @@ zend_result phar_free_alias(const phar_archive_data *phar) /* {{{ */ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, size_t fname_len, const char *alias, size_t alias_len, char **error) /* {{{ */ { phar_archive_data *fd, *fd_ptr; - char *my_realpath; phar_request_initialize(); @@ -1036,7 +1035,6 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz } } - my_realpath = NULL; const char *save = fname; size_t save_len = fname_len; @@ -1116,25 +1114,24 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz } /* not found, try converting \ to / */ - my_realpath = expand_filepath(fname, my_realpath); + char *my_realpath = expand_filepath(fname, NULL); - if (my_realpath) { - size_t my_realpath_len = strlen(my_realpath); -#ifdef PHP_WIN32 - phar_unixify_path_separators(my_realpath, my_realpath_len); -#endif - fname_len = my_realpath_len; - fname = my_realpath; - } else { + if (UNEXPECTED(!my_realpath)) { return FAILURE; } - fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len); + size_t my_realpath_len = strlen(my_realpath); +#ifdef PHP_WIN32 + phar_unixify_path_separators(my_realpath, my_realpath_len); +#endif + + fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), my_realpath, my_realpath_len); /* If we didn't find the path in the fname map, check in the cached manifest to see if we can find it */ if (!fd_ptr && PHAR_G(manifest_cached)) { - fd_ptr = zend_hash_str_find_ptr(&cached_phars, fname, fname_len); + fd_ptr = zend_hash_str_find_ptr(&cached_phars, my_realpath, my_realpath_len); } + efree(my_realpath); if (fd_ptr) { *archive = fd_ptr; @@ -1144,8 +1141,6 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, fd); } - efree(my_realpath); - PHAR_G(last_phar) = fd; PHAR_G(last_phar_name) = fd->fname; PHAR_G(last_alias) = fd->alias; @@ -1153,8 +1148,6 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz return SUCCESS; } - - efree(my_realpath); } return FAILURE; From 37d9689fb40ef730c4ca2b41476c4f478f384302 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 23 Apr 2026 20:32:03 +0100 Subject: [PATCH 5/8] ext/phar: remove save variable in phar_get_archive() It serves no purpose as fname is never modified so there is nothing to restore. Just use fname directly instead. --- ext/phar/util.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ext/phar/util.c b/ext/phar/util.c index 48ef45c9b724..f493cc3acee0 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1035,9 +1035,6 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz } } - const char *save = fname; - size_t save_len = fname_len; - if (fname && fname_len) { fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len); if (fd_ptr) { @@ -1090,7 +1087,7 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz return SUCCESS; } - fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), save, save_len); + fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), fname, fname_len); if (fd_ptr) { fd = *archive = fd_ptr; @@ -1102,7 +1099,7 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz return SUCCESS; } - if (PHAR_G(manifest_cached) && NULL != (fd_ptr = zend_hash_str_find_ptr(&cached_alias, save, save_len))) { + if (PHAR_G(manifest_cached) && NULL != (fd_ptr = zend_hash_str_find_ptr(&cached_alias, fname, fname_len))) { fd = *archive = fd_ptr; PHAR_G(last_phar) = fd; From 9e2841de6aaa676944f86d5f64aae0fa601059f2 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 23 Apr 2026 20:41:26 +0100 Subject: [PATCH 6/8] ext/phar: reorganize if branches as content is identical Just check in advance if we don't have an archive to checkin in the manifest cache. --- ext/phar/util.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/ext/phar/util.c b/ext/phar/util.c index f493cc3acee0..5057252a6014 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1088,18 +1088,13 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz } fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), fname, fname_len); - if (fd_ptr) { - fd = *archive = fd_ptr; - - PHAR_G(last_phar) = fd; - PHAR_G(last_phar_name) = fd->fname; - PHAR_G(last_alias) = fd->alias; - PHAR_G(last_alias_len) = fd->alias_len; - return SUCCESS; + /* If we didn't find the fname in the alias map, check in the cached manifest to see if we can find it */ + if (!fd_ptr && PHAR_G(manifest_cached)) { + fd_ptr = zend_hash_str_find_ptr(&cached_alias, fname, fname_len); } - if (PHAR_G(manifest_cached) && NULL != (fd_ptr = zend_hash_str_find_ptr(&cached_alias, fname, fname_len))) { + if (fd_ptr) { fd = *archive = fd_ptr; PHAR_G(last_phar) = fd; From cad713d99418df3eef780cdceb60393dc5324984 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 24 Apr 2026 14:25:26 +0100 Subject: [PATCH 7/8] ext/phar/util.c: use zend_hash_str_exists() in conditions in phar_get_archive() We don't actually care about the returned pointer, so use a clearer API to better communicate intent. --- ext/phar/util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/phar/util.c b/ext/phar/util.c index 5057252a6014..71bb5341fb79 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -984,7 +984,7 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz return FAILURE; } - if (PHAR_G(last_phar)->alias_len && NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), PHAR_G(last_phar)->alias, PHAR_G(last_phar)->alias_len))) { + if (PHAR_G(last_phar)->alias_len && zend_hash_str_exists(&(PHAR_G(phar_alias_map)), PHAR_G(last_phar)->alias, PHAR_G(last_phar)->alias_len)) { zend_hash_str_del(&(PHAR_G(phar_alias_map)), PHAR_G(last_phar)->alias, PHAR_G(last_phar)->alias_len); } @@ -1049,7 +1049,7 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz return FAILURE; } - if (fd->alias_len && NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), fd->alias, fd->alias_len))) { + if (fd->alias_len && zend_hash_str_exists(&(PHAR_G(phar_alias_map)), fd->alias, fd->alias_len)) { zend_hash_str_del(&(PHAR_G(phar_alias_map)), fd->alias, fd->alias_len); } From 54787f2dda8bbe5d8315d7f3d5f9e6ed4775c823 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 24 Apr 2026 14:29:57 +0100 Subject: [PATCH 8/8] ext/phar/util.c: remove dup fd variable in phar_get_archive() The naming between fd and fd_ptr seem to indicate one is not a pointer, but they both are. Moreover, there is no reason to copy the same value to the variables at the same time. --- ext/phar/util.c | 61 +++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/ext/phar/util.c b/ext/phar/util.c index 71bb5341fb79..491a07c4dd21 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -962,7 +962,7 @@ zend_result phar_free_alias(const phar_archive_data *phar) /* {{{ */ */ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, size_t fname_len, const char *alias, size_t alias_len, char **error) /* {{{ */ { - phar_archive_data *fd, *fd_ptr; + phar_archive_data *fd_ptr; phar_request_initialize(); @@ -999,8 +999,7 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz if (alias && alias_len) { /* If the alias stored in the last_phar cache matches, just use it directly */ if (PHAR_G(last_phar) && alias_len == PHAR_G(last_alias_len) && !memcmp(alias, PHAR_G(last_alias), alias_len)) { - fd = PHAR_G(last_phar); - fd_ptr = fd; + fd_ptr = PHAR_G(last_phar); } else { fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len); } @@ -1025,9 +1024,8 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz } *archive = fd_ptr; - fd = fd_ptr; - PHAR_G(last_phar) = fd; - PHAR_G(last_phar_name) = fd->fname; + PHAR_G(last_phar) = fd_ptr; + PHAR_G(last_phar_name) = fd_ptr->fname; PHAR_G(last_alias) = alias; PHAR_G(last_alias_len) = alias_len; @@ -1039,39 +1037,37 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len); if (fd_ptr) { *archive = fd_ptr; - fd = fd_ptr; if (alias && alias_len) { - if (!fd->is_temporary_alias && (alias_len != fd->alias_len || memcmp(fd->alias, alias, alias_len))) { + if (!fd_ptr->is_temporary_alias && (alias_len != fd_ptr->alias_len || memcmp(fd_ptr->alias, alias, alias_len))) { if (error) { spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, ZSTR_VAL(fd_ptr->fname), fname); } return FAILURE; } - if (fd->alias_len && zend_hash_str_exists(&(PHAR_G(phar_alias_map)), fd->alias, fd->alias_len)) { - zend_hash_str_del(&(PHAR_G(phar_alias_map)), fd->alias, fd->alias_len); + if (fd_ptr->alias_len && zend_hash_str_exists(&(PHAR_G(phar_alias_map)), fd_ptr->alias, fd_ptr->alias_len)) { + zend_hash_str_del(&(PHAR_G(phar_alias_map)), fd_ptr->alias, fd_ptr->alias_len); } - zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, fd); + zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, fd_ptr); } - PHAR_G(last_phar) = fd; - PHAR_G(last_phar_name) = fd->fname; - PHAR_G(last_alias) = fd->alias; - PHAR_G(last_alias_len) = fd->alias_len; + PHAR_G(last_phar) = fd_ptr; + PHAR_G(last_phar_name) = fd_ptr->fname; + PHAR_G(last_alias) = fd_ptr->alias; + PHAR_G(last_alias_len) = fd_ptr->alias_len; return SUCCESS; } if (PHAR_G(manifest_cached) && NULL != (fd_ptr = zend_hash_str_find_ptr(&cached_phars, fname, fname_len))) { *archive = fd_ptr; - fd = fd_ptr; /* this could be problematic - alias should never be different from manifest alias for cached phars */ - if (!fd->is_temporary_alias && alias && alias_len) { - if (alias_len != fd->alias_len || memcmp(fd->alias, alias, alias_len)) { + if (!fd_ptr->is_temporary_alias && alias && alias_len) { + if (alias_len != fd_ptr->alias_len || memcmp(fd_ptr->alias, alias, alias_len)) { if (error) { spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, ZSTR_VAL(fd_ptr->fname), fname); } @@ -1079,10 +1075,10 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz } } - PHAR_G(last_phar) = fd; - PHAR_G(last_phar_name) = fd->fname; - PHAR_G(last_alias) = fd->alias; - PHAR_G(last_alias_len) = fd->alias_len; + PHAR_G(last_phar) = fd_ptr; + PHAR_G(last_phar_name) = fd_ptr->fname; + PHAR_G(last_alias) = fd_ptr->alias; + PHAR_G(last_alias_len) = fd_ptr->alias_len; return SUCCESS; } @@ -1095,12 +1091,12 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz } if (fd_ptr) { - fd = *archive = fd_ptr; + *archive = fd_ptr; - PHAR_G(last_phar) = fd; - PHAR_G(last_phar_name) = fd->fname; - PHAR_G(last_alias) = fd->alias; - PHAR_G(last_alias_len) = fd->alias_len; + PHAR_G(last_phar) = fd_ptr; + PHAR_G(last_phar_name) = fd_ptr->fname; + PHAR_G(last_alias) = fd_ptr->alias; + PHAR_G(last_alias_len) = fd_ptr->alias_len; return SUCCESS; } @@ -1127,16 +1123,15 @@ zend_result phar_get_archive(phar_archive_data **archive, const char *fname, siz if (fd_ptr) { *archive = fd_ptr; - fd = fd_ptr; if (alias && alias_len) { - zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, fd); + zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, fd_ptr); } - PHAR_G(last_phar) = fd; - PHAR_G(last_phar_name) = fd->fname; - PHAR_G(last_alias) = fd->alias; - PHAR_G(last_alias_len) = fd->alias_len; + PHAR_G(last_phar) = fd_ptr; + PHAR_G(last_phar_name) = fd_ptr->fname; + PHAR_G(last_alias) = fd_ptr->alias; + PHAR_G(last_alias_len) = fd_ptr->alias_len; return SUCCESS; }