Commit 530276ab3fc for php.net
commit 530276ab3fc6d34bf231d52d2a93ce55996e0550
Author: Gina Peter Banyard <girgias@php.net>
Date: Thu Apr 23 20:12:31 2026 +0100
ext/phar: reorganize if statements to remove gotos in phar_get_archive()
And have a linear code flow that is easier to reason
diff --git a/ext/phar/util.c b/ext/phar/util.c
index efab7f9edab..41f9fce546e 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);
}