From 5c1194d99102b45cbcdd8e2e6c6ad647d4f946b7 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Fri, 17 Apr 2026 13:31:32 +0530 Subject: [PATCH 1/4] ext/phar: avoid redundant allocation by using zend_string for alias --- ext/phar/zip.c | 74 ++++++++++++++------------------------------------ 1 file changed, 20 insertions(+), 54 deletions(-) diff --git a/ext/phar/zip.c b/ext/phar/zip.c index f757adc90c88..9179bd0e9995 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -232,9 +232,9 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l uint16_t i; phar_archive_data *mydata = NULL; phar_entry_info entry = {0}; - char *ext, *actual_alias = NULL; + char *ext = NULL; char *metadata = NULL; - + zend_string *actual_alias = NULL; size = php_stream_tell(fp); if (size > sizeof(locator) + 65536) { @@ -341,7 +341,10 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l entry.fp_type = PHAR_FP; entry.is_persistent = mydata->is_persistent; #define PHAR_ZIP_FAIL(errmsg) \ - efree(actual_alias); \ + if (actual_alias) { \ + zend_string_release_ex(actual_alias, 0); \ + actual_alias = NULL; \ + } \ zend_hash_destroy(&mydata->manifest); \ HT_INVALIDATE(&mydata->manifest); \ zend_hash_destroy(&mydata->mounted_dirs); \ @@ -600,7 +603,7 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l ZVAL_UNDEF(&entry.metadata_tracker.val); } - if (!actual_alias && zend_string_equals_literal(entry.filename, ".phar/alias.txt")) { + if (actual_alias == NULL && zend_string_equals_literal(entry.filename, ".phar/alias.txt")) { php_stream_filter *filter; /* archive alias found */ @@ -626,19 +629,7 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l php_stream_filter_append(&fp->readfilters, filter); - // TODO: refactor to avoid reallocation ??? -//??? entry.uncompressed_filesize = php_stream_copy_to_mem(fp, &actual_alias, entry.uncompressed_filesize, 0) - { - zend_string *str = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); - if (str) { - entry.uncompressed_filesize = ZSTR_LEN(str); - actual_alias = estrndup(ZSTR_VAL(str), ZSTR_LEN(str)); - zend_string_release_ex(str, 0); - } else { - actual_alias = NULL; - entry.uncompressed_filesize = 0; - } - } + actual_alias = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); if (!entry.uncompressed_filesize) { php_stream_filter_remove(filter, 1); @@ -658,20 +649,7 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l } php_stream_filter_append(&fp->readfilters, filter); - - // TODO: refactor to avoid reallocation ??? -//??? entry.uncompressed_filesize = php_stream_copy_to_mem(fp, &actual_alias, entry.uncompressed_filesize, 0) - { - zend_string *str = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); - if (str) { - entry.uncompressed_filesize = ZSTR_LEN(str); - actual_alias = estrndup(ZSTR_VAL(str), ZSTR_LEN(str)); - zend_string_release_ex(str, 0); - } else { - actual_alias = NULL; - entry.uncompressed_filesize = 0; - } - } + actual_alias = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); if (!entry.uncompressed_filesize) { php_stream_filter_remove(filter, 1); @@ -682,19 +660,7 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l php_stream_filter_flush(filter, 1); php_stream_filter_remove(filter, 1); } else { - // TODO: refactor to avoid reallocation ??? -//??? entry.uncompressed_filesize = php_stream_copy_to_mem(fp, &actual_alias, entry.uncompressed_filesize, 0) - { - zend_string *str = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); - if (str) { - entry.uncompressed_filesize = ZSTR_LEN(str); - actual_alias = estrndup(ZSTR_VAL(str), ZSTR_LEN(str)); - zend_string_release_ex(str, 0); - } else { - actual_alias = NULL; - entry.uncompressed_filesize = 0; - } - } + actual_alias = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); if (!entry.uncompressed_filesize) { zend_string_release_ex(entry.filename, entry.is_persistent); @@ -725,37 +691,37 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l zend_hash_str_add_ptr(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len, mydata); - if (actual_alias) { + if (actual_alias != NULL) { phar_archive_data *fd_ptr; - if (!phar_validate_alias(actual_alias, mydata->alias_len)) { + if (!phar_validate_alias(ZSTR_VAL(actual_alias), ZSTR_LEN(actual_alias))) { if (error) { - spprintf(error, 4096, "phar error: invalid alias \"%s\" in zip-based phar \"%s\"", actual_alias, fname); + spprintf(error, 4096, "phar error: invalid alias \"%s\" in zip-based phar \"%s\"", ZSTR_VAL(actual_alias), fname); } - efree(actual_alias); + zend_string_release_ex(actual_alias, 0); zend_hash_str_del(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len); return FAILURE; } mydata->is_temporary_alias = 0; - if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), actual_alias, mydata->alias_len))) { + if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), ZSTR_VAL(actual_alias), ZSTR_LEN(actual_alias)))) { if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { spprintf(error, 4096, "phar error: Unable to add zip-based phar \"%s\" with implicit alias, alias is already in use", fname); } - efree(actual_alias); + zend_string_release_ex(actual_alias, 0); zend_hash_str_del(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len); return FAILURE; } } - mydata->alias = entry.is_persistent ? pestrndup(actual_alias, mydata->alias_len, 1) : actual_alias; - if (entry.is_persistent) { - efree(actual_alias); + mydata->alias = pestrndup(ZSTR_VAL(actual_alias), ZSTR_LEN(actual_alias), 1); + } else { + mydata->alias = estrndup(ZSTR_VAL(actual_alias), ZSTR_LEN(actual_alias)); } - + zend_string_release_ex(actual_alias, 0); zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), mydata->alias, mydata->alias_len, mydata); } else { phar_archive_data *fd_ptr; From 98b160143c62269f348e35f78c98549d9b93abe4 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Fri, 17 Apr 2026 13:46:20 +0530 Subject: [PATCH 2/4] ext/phar: avoid redundant allocation by using zend_string for alias --- ext/phar/zip.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 9179bd0e9995..771866be950d 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -630,8 +630,7 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l php_stream_filter_append(&fp->readfilters, filter); actual_alias = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); - - if (!entry.uncompressed_filesize) { + if (!actual_alias || !entry.uncompressed_filesize) { php_stream_filter_remove(filter, 1); zend_string_release_ex(entry.filename, entry.is_persistent); PHAR_ZIP_FAIL("unable to read in alias, truncated"); @@ -650,8 +649,7 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l php_stream_filter_append(&fp->readfilters, filter); actual_alias = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); - - if (!entry.uncompressed_filesize) { + if (!actual_alias || !entry.uncompressed_filesize) { php_stream_filter_remove(filter, 1); zend_string_release_ex(entry.filename, entry.is_persistent); PHAR_ZIP_FAIL("unable to read in alias, truncated"); @@ -661,8 +659,7 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l php_stream_filter_remove(filter, 1); } else { actual_alias = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); - - if (!entry.uncompressed_filesize) { + if (!actual_alias || !entry.uncompressed_filesize) { zend_string_release_ex(entry.filename, entry.is_persistent); PHAR_ZIP_FAIL("unable to read in alias, truncated"); } From b41aa38ec6687dcdf4540f64d43f56752b82b8c3 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Fri, 17 Apr 2026 13:47:29 +0530 Subject: [PATCH 3/4] ext/phar: avoid redundant allocation by using zend_string for alias --- ext/phar/zip.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 771866be950d..67e8aafdeb42 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -630,7 +630,8 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l php_stream_filter_append(&fp->readfilters, filter); actual_alias = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); - if (!actual_alias || !entry.uncompressed_filesize) { + entry.uncompressed_filesize = ZSTR_LEN(actual_alias); + if (!entry.uncompressed_filesize) { php_stream_filter_remove(filter, 1); zend_string_release_ex(entry.filename, entry.is_persistent); PHAR_ZIP_FAIL("unable to read in alias, truncated"); @@ -649,7 +650,8 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l php_stream_filter_append(&fp->readfilters, filter); actual_alias = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); - if (!actual_alias || !entry.uncompressed_filesize) { + entry.uncompressed_filesize = ZSTR_LEN(actual_alias); + if (!entry.uncompressed_filesize) { php_stream_filter_remove(filter, 1); zend_string_release_ex(entry.filename, entry.is_persistent); PHAR_ZIP_FAIL("unable to read in alias, truncated"); @@ -659,7 +661,8 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l php_stream_filter_remove(filter, 1); } else { actual_alias = php_stream_copy_to_mem(fp, entry.uncompressed_filesize, 0); - if (!actual_alias || !entry.uncompressed_filesize) { + entry.uncompressed_filesize = ZSTR_LEN(actual_alias); + if (!entry.uncompressed_filesize) { zend_string_release_ex(entry.filename, entry.is_persistent); PHAR_ZIP_FAIL("unable to read in alias, truncated"); } From 8b9558e550a0a2488187779e299c79d09cbce740 Mon Sep 17 00:00:00 2001 From: arshidkv12 Date: Fri, 17 Apr 2026 17:46:51 +0530 Subject: [PATCH 4/4] ext/phar: avoid redundant allocation by using zend_string for alias --- ext/phar/zip.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 67e8aafdeb42..5509b7582f43 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -603,7 +603,7 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l ZVAL_UNDEF(&entry.metadata_tracker.val); } - if (actual_alias == NULL && zend_string_equals_literal(entry.filename, ".phar/alias.txt")) { + if (!actual_alias && zend_string_equals_literal(entry.filename, ".phar/alias.txt")) { php_stream_filter *filter; /* archive alias found */ @@ -705,7 +705,7 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l mydata->is_temporary_alias = 0; - if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), ZSTR_VAL(actual_alias), ZSTR_LEN(actual_alias)))) { + if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), ZSTR_VAL(actual_alias), ZSTR_LEN(actual_alias)))) { if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { spprintf(error, 4096, "phar error: Unable to add zip-based phar \"%s\" with implicit alias, alias is already in use", fname);