From 32a9fcc8e59b880979229ea9f411ebedabfb6131 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 30 Apr 2026 15:00:10 +0100 Subject: [PATCH 1/6] ext/phar: use zend_string for alias arg of phar_open_or_create_filename() --- ext/phar/phar.c | 14 ++++++++------ ext/phar/phar_internal.h | 2 +- ext/phar/phar_object.c | 10 +++++----- ext/phar/stream.c | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 38c4bb26ff89..f144a8f5c284 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -1302,7 +1302,7 @@ static zend_result phar_parse_pharfile(php_stream *fp, const char *fname, size_t /** * Create or open a phar for writing */ -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_open_or_create_filename(zend_string *fname, const char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_filename(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ { const char *ext_str, *z; char *my_error; @@ -1327,8 +1327,10 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_open_or_create_filename(ze } return FAILURE; } -check_file: - if (phar_open_parsed_phar(ZSTR_VAL(fname), ZSTR_LEN(fname), alias, alias_len, is_data, options, test, &my_error) == SUCCESS) { +check_file:; + const char *alias_cstr = alias ? ZSTR_VAL(alias) : NULL; + size_t alias_len = alias ? ZSTR_LEN(alias) : 0; + if (phar_open_parsed_phar(ZSTR_VAL(fname), ZSTR_LEN(fname), alias_cstr, alias_len, is_data, options, test, &my_error) == SUCCESS) { *pphar = *test; if ((*test)->is_data && !(*test)->is_tar && !(*test)->is_zip) { @@ -1354,15 +1356,15 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_open_or_create_filename(ze if (ext_len > 3 && (z = memchr(ext_str, 'z', ext_len)) && ((ext_str + ext_len) - z >= 2) && !memcmp(z + 1, "ip", 2)) { /* assume zip-based phar */ - return phar_open_or_create_zip(fname, alias, alias_len, is_data, options, pphar, error); + return phar_open_or_create_zip(fname, alias_cstr, alias_len, is_data, options, pphar, error); } if (ext_len > 3 && (z = memchr(ext_str, 't', ext_len)) && ((ext_str + ext_len) - z >= 2) && !memcmp(z + 1, "ar", 2)) { /* assume tar-based phar */ - return phar_open_or_create_tar(fname, alias, alias_len, is_data, options, pphar, error); + return phar_open_or_create_tar(fname, alias_cstr, alias_len, is_data, options, pphar, error); } - return phar_create_or_parse_filename(fname, alias, alias_len, is_data, options, pphar, error); + return phar_create_or_parse_filename(fname, alias_cstr, alias_len, is_data, options, pphar, error); } /* }}} */ diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 5054699a8cbd..0b4a29ca43be 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -407,7 +407,7 @@ void phar_destroy_phar_data(phar_archive_data *phar); ZEND_ATTRIBUTE_NONNULL zend_result phar_postprocess_file(phar_entry_data *idata, uint32_t crc32, char **error, int process_zip); zend_result phar_open_from_filename(char *fname, size_t fname_len, const zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error); -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_open_or_create_filename(zend_string *fname, const char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_filename(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_create_or_parse_filename(zend_string *fname, const char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(const zend_string *alias, char **error); zend_result phar_free_alias(const phar_archive_data *phar); diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 260214cc3687..81c4fd14f7b3 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -1085,8 +1085,8 @@ static const spl_other_handler phar_spl_foreign_handler = { PHP_METHOD(Phar, __construct) { zend_string *fname; - char *alias = NULL, *error; - size_t alias_len = 0; + zend_string *alias = NULL; + char *error; bool is_data; zend_long flags = SPL_FILE_DIR_SKIPDOTS|SPL_FILE_DIR_UNIXPATHS; zend_long format = 0; @@ -1099,11 +1099,11 @@ PHP_METHOD(Phar, __construct) is_data = instanceof_function(Z_OBJCE_P(ZEND_THIS), phar_ce_data); if (is_data) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|ls!l", &fname, &flags, &alias, &alias_len, &format) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|lS!l", &fname, &flags, &alias, &format) == FAILURE) { RETURN_THROWS(); } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|ls!", &fname, &flags, &alias, &alias_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|lS!", &fname, &flags, &alias) == FAILURE) { RETURN_THROWS(); } } @@ -1122,7 +1122,7 @@ PHP_METHOD(Phar, __construct) fname = arch; } - zend_result phar_status = phar_open_or_create_filename(fname, alias, alias_len, is_data, REPORT_ERRORS, &phar_data, &error); + zend_result phar_status = phar_open_or_create_filename(fname, alias, is_data, REPORT_ERRORS, &phar_data, &error); if (arch) { zend_string_release_ex(arch, false); diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 29ce9ea9077d..772f9c2769a5 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -114,7 +114,7 @@ php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const php_url_free(resource); return NULL; } - if (phar_open_or_create_filename(resource->host, NULL, 0, 0, options, &phar, &error) == FAILURE) + if (phar_open_or_create_filename(resource->host, NULL, 0, options, &phar, &error) == FAILURE) { if (error) { if (!(options & PHP_STREAM_URL_STAT_QUIET)) { From 78da37f6f6b98ff30b0e060c7e48ec51debbbe76 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 30 Apr 2026 15:06:04 +0100 Subject: [PATCH 2/6] ext/phar: use zend_string for alias arg of phar_open_or_create_filename() --- ext/phar/phar.c | 22 ++++++++++++---------- ext/phar/phar_internal.h | 6 +++--- ext/phar/tar.c | 4 ++-- ext/phar/zip.c | 4 ++-- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index f144a8f5c284..a4cedc38bc92 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -1356,21 +1356,21 @@ check_file:; if (ext_len > 3 && (z = memchr(ext_str, 'z', ext_len)) && ((ext_str + ext_len) - z >= 2) && !memcmp(z + 1, "ip", 2)) { /* assume zip-based phar */ - return phar_open_or_create_zip(fname, alias_cstr, alias_len, is_data, options, pphar, error); + return phar_open_or_create_zip(fname, alias, is_data, options, pphar, error); } if (ext_len > 3 && (z = memchr(ext_str, 't', ext_len)) && ((ext_str + ext_len) - z >= 2) && !memcmp(z + 1, "ar", 2)) { /* assume tar-based phar */ - return phar_open_or_create_tar(fname, alias_cstr, alias_len, is_data, options, pphar, error); + return phar_open_or_create_tar(fname, alias, is_data, options, pphar, error); } - return phar_create_or_parse_filename(fname, alias_cstr, alias_len, is_data, options, pphar, error); + return phar_create_or_parse_filename(fname, alias, is_data, options, pphar, error); } /* }}} */ static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error); -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_create_or_parse_filename(zend_string *fname, const char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ { php_stream *fp; zend_string *actual = NULL; @@ -1388,8 +1388,10 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_create_or_parse_filename(z fname = actual; } + const char *alias_cstr = alias ? ZSTR_VAL(alias) : NULL; + size_t alias_len = alias ? ZSTR_LEN(alias) : 0; if (fp) { - if (phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias, alias_len, options, pphar, error) == SUCCESS) { + if (phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias_cstr, alias_len, options, pphar, error) == SUCCESS) { if ((*pphar)->is_data || !PHAR_G(readonly)) { (*pphar)->is_writeable = 1; } @@ -1466,9 +1468,9 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_create_or_parse_filename(z mydata->is_tar = 1; } else { if (alias) { - const phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len); + const phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias_cstr, alias_len); if (fd_ptr && SUCCESS != phar_free_alias(fd_ptr)) { - spprintf(error, 4096, "phar error: phar \"%s\" cannot set alias \"%s\", already in use by another phar archive", ZSTR_VAL(mydata->fname), alias); + spprintf(error, 4096, "phar error: phar \"%s\" cannot set alias \"%s\", already in use by another phar archive", ZSTR_VAL(mydata->fname), alias_cstr); zend_hash_del(&(PHAR_G(phar_fname_map)), mydata->fname); @@ -1479,14 +1481,14 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_create_or_parse_filename(z } ZEND_ASSERT(!mydata->is_persistent); - mydata->alias = alias ? estrndup(alias, alias_len) : estrndup(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname)); + mydata->alias = alias ? estrndup(alias_cstr, alias_len) : estrndup(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname)); mydata->alias_len = alias ? alias_len : ZSTR_LEN(mydata->fname); } if (alias_len && alias) { - if (NULL == zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, mydata)) { + if (NULL == zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias_cstr, alias_len, mydata)) { if (options & REPORT_ERRORS) { - spprintf(error, 0, "archive \"%s\" cannot be associated with alias \"%s\", already in use", ZSTR_VAL(fname), alias); + spprintf(error, 0, "archive \"%s\" cannot be associated with alias \"%s\", already in use", ZSTR_VAL(fname), alias_cstr); } zend_hash_del(&(PHAR_G(phar_fname_map)), mydata->fname); diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 0b4a29ca43be..885a2015b42c 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -408,7 +408,7 @@ void phar_destroy_phar_data(phar_archive_data *phar); ZEND_ATTRIBUTE_NONNULL zend_result phar_postprocess_file(phar_entry_data *idata, uint32_t crc32, char **error, int process_zip); zend_result phar_open_from_filename(char *fname, size_t fname_len, const zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_filename(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_create_or_parse_filename(zend_string *fname, const char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(const zend_string *alias, char **error); zend_result phar_free_alias(const phar_archive_data *phar); phar_archive_data* phar_get_archive(const char *fname, size_t fname_len, const char *alias, size_t alias_len, char **error); @@ -446,12 +446,12 @@ zend_result phar_copy_on_write(phar_archive_data **pphar); /* tar functions in tar.c */ bool phar_is_tar(const char *buf, const char *fname); zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error); -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_open_or_create_tar(zend_string *fname, const char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_tar(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error); /* zip functions in zip.c */ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, char **error); -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_open_or_create_zip(zend_string *fname, const char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_zip(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error); #ifdef PHAR_MAIN diff --git a/ext/phar/tar.c b/ext/phar/tar.c index edb0707a6ff7..fc6d392c1196 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -126,10 +126,10 @@ bool phar_is_tar(const char *buf, const char *fname) /* {{{ */ } /* }}} */ -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_open_or_create_tar(zend_string *fname, const char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_tar(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ { phar_archive_data *phar; - zend_result ret = phar_create_or_parse_filename(fname, alias, alias_len, is_data, options, &phar, error); + zend_result ret = phar_create_or_parse_filename(fname, alias, is_data, options, &phar, error); if (FAILURE == ret) { return FAILURE; diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 900b41f9c794..712b686f0a31 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -794,10 +794,10 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l /** * Create or open a zip-based phar for writing */ -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_open_or_create_zip(zend_string *fname, const char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_zip(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ { phar_archive_data *phar; - zend_result ret = phar_create_or_parse_filename(fname, alias, alias_len, is_data, options, &phar, error); + zend_result ret = phar_create_or_parse_filename(fname, alias, is_data, options, &phar, error); if (FAILURE == ret) { return FAILURE; From ee14c9970ac49901e55cdb90650dc7d7e27ade90 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 30 Apr 2026 15:15:16 +0100 Subject: [PATCH 3/6] ext/phar: remove const qualifier for alias zend_string param As we want to use it to lookup hash tables and in the future copy it. --- ext/phar/phar.c | 37 +++++++++++++++++++++++-------------- ext/phar/phar_internal.h | 8 ++++---- ext/phar/tar.c | 11 ++++++++--- ext/phar/zip.c | 11 ++++++++--- 4 files changed, 43 insertions(+), 24 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index a4cedc38bc92..30bedaae02b3 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -1302,8 +1302,14 @@ static zend_result phar_parse_pharfile(php_stream *fp, const char *fname, size_t /** * Create or open a phar for writing */ -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_filename(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ -{ +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_filename( + zend_string *fname, + /* copyable & hash update */ zend_string *alias, + bool is_data, + uint32_t options, + phar_archive_data** pphar, + char **error +) { const char *ext_str, *z; char *my_error; size_t ext_len; @@ -1366,12 +1372,17 @@ check_file:; return phar_create_or_parse_filename(fname, alias, is_data, options, pphar, error); } -/* }}} */ static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error); -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ -{ +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename( + zend_string *fname, + /* copyable & hash update */ zend_string *alias, + bool is_data, + uint32_t options, + phar_archive_data** pphar, + char **error +) { php_stream *fp; zend_string *actual = NULL; zend_string *save_fname = fname; @@ -1462,15 +1473,14 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(z if (is_data) { alias = NULL; - alias_len = 0; mydata->is_data = 1; /* assume tar format, PharData can specify other */ mydata->is_tar = 1; } else { if (alias) { - const phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias_cstr, alias_len); + const phar_archive_data *fd_ptr = zend_hash_find_ptr(&(PHAR_G(phar_alias_map)), alias); if (fd_ptr && SUCCESS != phar_free_alias(fd_ptr)) { - spprintf(error, 4096, "phar error: phar \"%s\" cannot set alias \"%s\", already in use by another phar archive", ZSTR_VAL(mydata->fname), alias_cstr); + spprintf(error, 4096, "phar error: phar \"%s\" cannot set alias \"%s\", already in use by another phar archive", ZSTR_VAL(mydata->fname), ZSTR_VAL(alias)); zend_hash_del(&(PHAR_G(phar_fname_map)), mydata->fname); @@ -1481,14 +1491,14 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(z } ZEND_ASSERT(!mydata->is_persistent); - mydata->alias = alias ? estrndup(alias_cstr, alias_len) : estrndup(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname)); - mydata->alias_len = alias ? alias_len : ZSTR_LEN(mydata->fname); + mydata->alias = alias ? estrndup(ZSTR_VAL(alias), ZSTR_LEN(alias)) : estrndup(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname)); + mydata->alias_len = alias ? ZSTR_LEN(alias) : ZSTR_LEN(mydata->fname); } - if (alias_len && alias) { - if (NULL == zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias_cstr, alias_len, mydata)) { + if (alias) { + if (NULL == zend_hash_add_ptr(&(PHAR_G(phar_alias_map)), alias, mydata)) { if (options & REPORT_ERRORS) { - spprintf(error, 0, "archive \"%s\" cannot be associated with alias \"%s\", already in use", ZSTR_VAL(fname), alias_cstr); + spprintf(error, 0, "archive \"%s\" cannot be associated with alias \"%s\", already in use", ZSTR_VAL(fname), ZSTR_VAL(alias)); } zend_hash_del(&(PHAR_G(phar_fname_map)), mydata->fname); @@ -1502,7 +1512,6 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(z *pphar = mydata; return SUCCESS; } -/* }}}*/ /** * Return an already opened filename. diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 885a2015b42c..974ac17b1c34 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -407,8 +407,8 @@ void phar_destroy_phar_data(phar_archive_data *phar); ZEND_ATTRIBUTE_NONNULL zend_result phar_postprocess_file(phar_entry_data *idata, uint32_t crc32, char **error, int process_zip); zend_result phar_open_from_filename(char *fname, size_t fname_len, const zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error); -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_filename(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_filename(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(const zend_string *alias, char **error); zend_result phar_free_alias(const phar_archive_data *phar); phar_archive_data* phar_get_archive(const char *fname, size_t fname_len, const char *alias, size_t alias_len, char **error); @@ -446,12 +446,12 @@ zend_result phar_copy_on_write(phar_archive_data **pphar); /* tar functions in tar.c */ bool phar_is_tar(const char *buf, const char *fname); zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error); -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_tar(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_tar(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error); /* zip functions in zip.c */ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, char **error); -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_zip(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_zip(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error); #ifdef PHAR_MAIN diff --git a/ext/phar/tar.c b/ext/phar/tar.c index fc6d392c1196..fee9226c535e 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -126,8 +126,14 @@ bool phar_is_tar(const char *buf, const char *fname) /* {{{ */ } /* }}} */ -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_tar(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ -{ +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_tar( + zend_string *fname, + /* copyable & hash update */ zend_string *alias, + bool is_data, + uint32_t options, + phar_archive_data** pphar, + char **error +) { phar_archive_data *phar; zend_result ret = phar_create_or_parse_filename(fname, alias, is_data, options, &phar, error); @@ -153,7 +159,6 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_tar(zend_st spprintf(error, 4096, "phar tar error: \"%s\" already exists as a regular phar and must be deleted from disk prior to creating as a tar-based phar", ZSTR_VAL(fname)); return FAILURE; } -/* }}} */ static zend_result phar_tar_process_metadata(phar_entry_info *entry, php_stream *fp) /* {{{ */ { diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 712b686f0a31..b35e400a7db3 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -794,8 +794,14 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l /** * Create or open a zip-based phar for writing */ -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_zip(zend_string *fname, const zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ -{ +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_zip( + zend_string *fname, + /* copyable & hash update */ zend_string *alias, + bool is_data, + uint32_t options, + phar_archive_data** pphar, + char **error +) { phar_archive_data *phar; zend_result ret = phar_create_or_parse_filename(fname, alias, is_data, options, &phar, error); @@ -822,7 +828,6 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_zip(zend_st return FAILURE; } -/* }}} */ struct _phar_zip_pass { php_stream *filefp; From b5b2c5dfb847d0f85e51ebd2448db4627cf14266 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sat, 2 May 2026 16:24:18 +0100 Subject: [PATCH 4/6] ext/phar: use zend_string for alias arg of phar_open_from_fp() Required removing some const qualifiers on zend_string* and propagate the change to simplify the code. --- ext/phar/phar.c | 43 +++++++++++++++++++++++++--------------- ext/phar/phar_internal.h | 8 ++++---- ext/phar/tar.c | 22 ++++++++++++-------- ext/phar/zip.c | 20 ++++++++++++------- 4 files changed, 58 insertions(+), 35 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 30bedaae02b3..f72a14a59512 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -1373,7 +1373,7 @@ check_file:; return phar_create_or_parse_filename(fname, alias, is_data, options, pphar, error); } -static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error); +static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename( zend_string *fname, @@ -1399,10 +1399,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename( fname = actual; } - const char *alias_cstr = alias ? ZSTR_VAL(alias) : NULL; - size_t alias_len = alias ? ZSTR_LEN(alias) : 0; if (fp) { - if (phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias_cstr, alias_len, options, pphar, error) == SUCCESS) { + if (phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias, options, pphar, error) == SUCCESS) { if ((*pphar)->is_data || !PHAR_G(readonly)) { (*pphar)->is_writeable = 1; } @@ -1520,8 +1518,14 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename( * that the manifest is proper, then pass it to phar_parse_pharfile(). SUCCESS * or FAILURE is returned and pphar is set to a pointer to the phar's manifest */ -zend_result phar_open_from_filename(char *fname, size_t fname_len, const zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ -{ +zend_result phar_open_from_filename( + char *fname, + size_t fname_len, + /* copyable & hash update */ zend_string *alias, + uint32_t options, + phar_archive_data** pphar, + char **error +) { php_stream *fp; zend_string *actual; bool is_data = false; @@ -1564,7 +1568,7 @@ zend_result phar_open_from_filename(char *fname, size_t fname_len, const zend_st fname_len = ZSTR_LEN(actual); } - zend_result ret = phar_open_from_fp(fp, fname, fname_len, alias_cstr, alias_len, options, pphar, error); + zend_result ret = phar_open_from_fp(fp, fname, fname_len, alias, options, pphar, error); if (actual) { zend_string_release_ex(actual, 0); @@ -1572,15 +1576,21 @@ zend_result phar_open_from_filename(char *fname, size_t fname_len, const zend_st return ret; } -/* }}}*/ /** * Scan an open fp for the required __HALT_COMPILER(); ?> token and verify * that the manifest is proper, then pass it to phar_parse_pharfile(). SUCCESS * or FAILURE is returned and pphar is set to a pointer to the phar's manifest */ -static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */ -{ +static zend_result phar_open_from_fp( + php_stream* fp, + const char *fname, + size_t fname_len, + /* copyable & hash update */ zend_string *alias, + uint32_t options, + phar_archive_data** pphar, + char **error +) { static const char token[] = "__HALT_COMPILER();"; static const char zip_magic[] = "PK\x03\x04"; static const char gz_magic[] = "\x1f\x8b\x08"; @@ -1731,20 +1741,22 @@ static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t f if (!memcmp(pos, zip_magic, 4)) { php_stream_seek(fp, 0, SEEK_END); - return phar_parse_zipfile(fp, fname, fname_len, alias, alias_len, pphar, error); + return phar_parse_zipfile(fp, fname, fname_len, alias, pphar, error); } if (got >= 512) { if (phar_is_tar(pos, fname)) { php_stream_rewind(fp); - return phar_parse_tarfile(fp, fname, fname_len, alias, alias_len, pphar, compression, error); + return phar_parse_tarfile(fp, fname, fname_len, alias, pphar, compression, error); } } } if (got > 0 && (pos = php_memnistr(buffer, token, tokenlen, buffer + got + sizeof(token))) != NULL) { halt_offset += (pos - buffer); /* no -tokenlen+tokenlen here */ - return phar_parse_pharfile(fp, fname, fname_len, alias, alias_len, halt_offset, pphar, compression, error); + const char *alias_cstr = alias ? ZSTR_VAL(alias) : NULL; + size_t alias_len = alias ? ZSTR_LEN(alias) : 0; + return phar_parse_pharfile(fp, fname, fname_len, alias_cstr, alias_len, halt_offset, pphar, compression, error); } halt_offset += got; @@ -1753,7 +1765,6 @@ static zend_result phar_open_from_fp(php_stream* fp, const char *fname, size_t f MAPPHAR_ALLOC_FAIL("internal corruption of phar \"%s\" (__HALT_COMPILER(); not found)") } -/* }}} */ /* * given the location of the file extension and the start of the file path, @@ -2267,7 +2278,7 @@ zend_string* phar_split_fname(const char *filename, size_t filename_len, zend_st * Invoked when a user calls Phar::mapPhar() from within an executing .phar * to set up its manifest directly */ -ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(const zend_string *alias, char **error) /* {{{ */ +ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(/* copyable & hash update */ zend_string *alias, char **error) /* {{{ */ { *error = NULL; @@ -2309,7 +2320,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(const zen fname = actual; } - zend_result ret = phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias_cstr, alias_len, REPORT_ERRORS, NULL, error); + zend_result ret = phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias, REPORT_ERRORS, NULL, error); if (actual) { zend_string_release_ex(actual, 0); diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 974ac17b1c34..2d4a83ae369c 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -406,10 +406,10 @@ void phar_object_init(void); void phar_destroy_phar_data(phar_archive_data *phar); ZEND_ATTRIBUTE_NONNULL zend_result phar_postprocess_file(phar_entry_data *idata, uint32_t crc32, char **error, int process_zip); -zend_result phar_open_from_filename(char *fname, size_t fname_len, const zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error); +zend_result phar_open_from_filename(char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_filename(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_create_or_parse_filename(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); -ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(const zend_string *alias, char **error); +ZEND_ATTRIBUTE_NONNULL_ARGS(2) zend_result phar_open_executed_filename(/* copyable & hash update */ zend_string *alias, char **error); zend_result phar_free_alias(const phar_archive_data *phar); phar_archive_data* phar_get_archive(const char *fname, size_t fname_len, const char *alias, size_t alias_len, char **error); zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, const char *sig, size_t sig_len, const char *fname, char **signature, size_t *signature_len, char **error); @@ -445,12 +445,12 @@ zend_result phar_copy_on_write(phar_archive_data **pphar); /* tar functions in tar.c */ bool phar_is_tar(const char *buf, const char *fname); -zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error); +zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, phar_archive_data** pphar, uint32_t compression, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_tar(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error); /* zip functions in zip.c */ -zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, char **error); +zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_len, /* copyable & hash update */ zend_string *alias, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5, 6) zend_result phar_open_or_create_zip(zend_string *fname, /* copyable & hash update */ zend_string *alias, bool is_data, uint32_t options, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error); diff --git a/ext/phar/tar.c b/ext/phar/tar.c index fee9226c535e..f85241ccc4e5 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -202,8 +202,15 @@ static zend_result phar_tar_process_metadata(phar_entry_info *entry, php_stream } /* }}} */ -zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error) /* {{{ */ -{ +zend_result phar_parse_tarfile( + php_stream* fp, + const char *fname, + size_t fname_len, + /* copyable & hash update */ zend_string *alias, + phar_archive_data** pphar, + uint32_t compression, + char **error +) { char buf[512], *actual_alias = NULL, *p; phar_entry_info entry = {0}; size_t pos = 0, read, totalsize; @@ -679,8 +686,8 @@ zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_l zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), actual_alias, myphar->alias_len, myphar); } else { - if (alias_len) { - phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len); + if (alias) { + phar_archive_data *fd_ptr = zend_hash_find_ptr(&(PHAR_G(phar_alias_map)), alias); if (fd_ptr) { if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { @@ -690,9 +697,9 @@ zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_l return FAILURE; } } - zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, myphar); - myphar->alias = pestrndup(alias, alias_len, myphar->is_persistent); - myphar->alias_len = alias_len; + zend_hash_add_ptr(&(PHAR_G(phar_alias_map)), alias, myphar); + myphar->alias = pestrndup(ZSTR_VAL(alias), ZSTR_LEN(alias), myphar->is_persistent); + myphar->alias_len = ZSTR_LEN(alias); } else { myphar->alias = pestrndup(ZSTR_VAL(myphar->fname), ZSTR_LEN(myphar->fname), myphar->is_persistent); myphar->alias_len = ZSTR_LEN(myphar->fname); @@ -707,7 +714,6 @@ zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_l return SUCCESS; } -/* }}} */ struct _phar_pass_tar_info { php_stream *old; diff --git a/ext/phar/zip.c b/ext/phar/zip.c index b35e400a7db3..7811865e3e69 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -224,8 +224,14 @@ static char *phar_find_eocd(const char *s, size_t n) * This is used by phar_open_from_fp to process a zip-based phar, but can be called * directly. */ -zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, char **error) /* {{{ */ -{ +zend_result phar_parse_zipfile( + php_stream *fp, + const char *fname, + size_t fname_len, + /* copyable & hash update */ zend_string *alias, + phar_archive_data** pphar, + char **error +) { phar_zip_dir_end locator; char buf[sizeof(locator) + 65536]; zend_off_t size; @@ -760,8 +766,8 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), mydata->alias, mydata->alias_len, mydata); } else { - if (alias_len) { - phar_archive_data *fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len); + if (alias) { + phar_archive_data *fd_ptr = zend_hash_find_ptr(&(PHAR_G(phar_alias_map)), alias); if (fd_ptr) { if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { @@ -772,9 +778,9 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l } } - zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, mydata); - mydata->alias = pestrndup(alias, alias_len, mydata->is_persistent); - mydata->alias_len = alias_len; + zend_hash_add_ptr(&(PHAR_G(phar_alias_map)), alias, mydata); + mydata->alias = pestrndup(ZSTR_VAL(alias), ZSTR_LEN(alias), mydata->is_persistent); + mydata->alias_len = ZSTR_LEN(alias); } else { mydata->alias = pestrndup(ZSTR_VAL(mydata->fname), ZSTR_LEN(mydata->fname), mydata->is_persistent); mydata->alias_len = fname_len; From 8bec211b0ce15f4115f3e0a37d9e1b37d7ea5b45 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 7 May 2026 18:29:17 +0100 Subject: [PATCH 5/6] ext/phar: remove pphar argument of phar_find_in_include_path() (#21975) It was always passed a NULL pointer, so just remove it and simplify the implementation of it. --- ext/phar/func_interceptors.c | 2 +- ext/phar/phar.c | 2 +- ext/phar/phar_internal.h | 2 +- ext/phar/util.c | 30 ++---------------------------- 4 files changed, 5 insertions(+), 31 deletions(-) diff --git a/ext/phar/func_interceptors.c b/ext/phar/func_interceptors.c index 8f5d1ab068f1..f6e69f20035c 100644 --- a/ext/phar/func_interceptors.c +++ b/ext/phar/func_interceptors.c @@ -106,7 +106,7 @@ static zend_string* phar_get_name_for_relative_paths(zend_string *filename, bool zend_string *name = NULL; if (using_include_path) { - name = phar_find_in_include_path(filename, NULL); + name = phar_find_in_include_path(filename); if (!name) { /* this file is not in the phar, use the original path */ zend_string_release_ex(arch, false); diff --git a/ext/phar/phar.c b/ext/phar/phar.c index f72a14a59512..b4cdd1577dd0 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -3166,7 +3166,7 @@ zend_op_array *(*phar_orig_compile_file)(zend_file_handle *file_handle, int type static zend_string *phar_resolve_path(zend_string *filename) { - zend_string *ret = phar_find_in_include_path(filename, NULL); + zend_string *ret = phar_find_in_include_path(filename); if (!ret) { ret = phar_save_resolve_path(filename); } diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 2d4a83ae369c..d75498f9c95a 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -423,7 +423,7 @@ const char *phar_compress_filter(const phar_entry_info *entry, bool return_unkno /* void phar_remove_virtual_dirs(phar_archive_data *phar, char *filename, size_t filename_len); */ void phar_add_virtual_dirs(phar_archive_data *phar, const char *filename, size_t filename_len); zend_result phar_mount_entry(phar_archive_data *phar, const char *filename, size_t filename_len, char *path, size_t path_len); -zend_string *phar_find_in_include_path(const zend_string *file, phar_archive_data **pphar); + zend_string *phar_find_in_include_path(const zend_string *file); zend_string* phar_fix_filepath(const char *path, size_t path_length, bool use_cwd); ZEND_ATTRIBUTE_NONNULL phar_entry_info * phar_open_jit(const phar_archive_data *phar, phar_entry_info *entry, char **error); void phar_parse_metadata_lazy(const char *buffer, phar_metadata_tracker *tracker, uint32_t zip_metadata_len, bool persistent); diff --git a/ext/phar/util.c b/ext/phar/util.c index e501ccfaceba..c1e752a8e6b2 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -264,19 +264,13 @@ zend_result phar_mount_entry(phar_archive_data *phar, const char *filename, size } /* }}} */ -zend_string *phar_find_in_include_path(const zend_string *filename, phar_archive_data **pphar) /* {{{ */ +zend_string *phar_find_in_include_path(const zend_string *filename) /* {{{ */ { zend_string *ret; char *path; zend_string *arch; phar_archive_data *phar; - if (pphar) { - *pphar = NULL; - } else { - pphar = &phar; - } - if (!zend_is_executing() || !PHAR_G(cwd)) { return NULL; } @@ -314,11 +308,7 @@ zend_string *phar_find_in_include_path(const zend_string *filename, phar_archive zend_string_release_ex(arch, false); return NULL; } -splitted: - if (pphar) { - *pphar = phar; - } - +splitted:; zend_string *test = phar_fix_filepath(ZSTR_VAL(filename), ZSTR_LEN(filename), true); if (ZSTR_VAL(test)[0] == '/') { if (zend_hash_str_exists(&(phar->manifest), ZSTR_VAL(test) + 1, ZSTR_LEN(test) - 1)) { @@ -347,22 +337,6 @@ zend_string *phar_find_in_include_path(const zend_string *filename, phar_archive ret = php_resolve_path(ZSTR_VAL(filename), ZSTR_LEN(filename), path); efree(path); - if (ret && zend_string_starts_with_literal_ci(ret, "phar://")) { - /* found phar:// */ - arch = phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, 1, 0); - if (!arch) { - return ret; - } - - *pphar = zend_hash_find_ptr(&(PHAR_G(phar_fname_map)), arch); - - if (!*pphar && PHAR_G(manifest_cached)) { - *pphar = zend_hash_find_ptr(&cached_phars, arch); - } - - zend_string_release_ex(arch, false); - } - return ret; } /* }}} */ From f79f921d581e4303101305c9d9dc9d420c934382 Mon Sep 17 00:00:00 2001 From: Shivam Mathur Date: Thu, 7 May 2026 19:32:54 +0000 Subject: [PATCH 6/6] Preserve full XMM registers in Windows VM wrapper (#21976) --- Zend/asm/save_xmm_x86_64_ms_masm.asm | 48 ++++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/Zend/asm/save_xmm_x86_64_ms_masm.asm b/Zend/asm/save_xmm_x86_64_ms_masm.asm index 1569d6bdb0e8..0af7c346095d 100644 --- a/Zend/asm/save_xmm_x86_64_ms_masm.asm +++ b/Zend/asm/save_xmm_x86_64_ms_masm.asm @@ -9,34 +9,34 @@ EXTERN execute_ex_real:PROC ; save the preserved registers when re-entering the VM from JIT code. ; See GH-18136. execute_ex PROC EXPORT FRAME - ; 10 floating points numbers + ; 10 XMM registers ; 32 bytes shadow space ; 8 bytes to align after the return address - sub rsp, 8*10 + 32 + 8 - .allocstack 8*10 + 32 + 8 + sub rsp, 16*10 + 32 + 8 + .allocstack 16*10 + 32 + 8 .endprolog - movsd qword ptr [rsp + 32 + 8*0], xmm6 - movsd qword ptr [rsp + 32 + 8*1], xmm7 - movsd qword ptr [rsp + 32 + 8*2], xmm8 - movsd qword ptr [rsp + 32 + 8*3], xmm9 - movsd qword ptr [rsp + 32 + 8*4], xmm10 - movsd qword ptr [rsp + 32 + 8*5], xmm11 - movsd qword ptr [rsp + 32 + 8*6], xmm12 - movsd qword ptr [rsp + 32 + 8*7], xmm13 - movsd qword ptr [rsp + 32 + 8*8], xmm14 - movsd qword ptr [rsp + 32 + 8*9], xmm15 + movaps xmmword ptr [rsp + 32 + 16*0], xmm6 + movaps xmmword ptr [rsp + 32 + 16*1], xmm7 + movaps xmmword ptr [rsp + 32 + 16*2], xmm8 + movaps xmmword ptr [rsp + 32 + 16*3], xmm9 + movaps xmmword ptr [rsp + 32 + 16*4], xmm10 + movaps xmmword ptr [rsp + 32 + 16*5], xmm11 + movaps xmmword ptr [rsp + 32 + 16*6], xmm12 + movaps xmmword ptr [rsp + 32 + 16*7], xmm13 + movaps xmmword ptr [rsp + 32 + 16*8], xmm14 + movaps xmmword ptr [rsp + 32 + 16*9], xmm15 call execute_ex_real - movsd xmm6, qword ptr [rsp + 32 + 8*0] - movsd xmm7, qword ptr [rsp + 32 + 8*1] - movsd xmm8, qword ptr [rsp + 32 + 8*2] - movsd xmm9, qword ptr [rsp + 32 + 8*3] - movsd xmm10, qword ptr [rsp + 32 + 8*4] - movsd xmm11, qword ptr [rsp + 32 + 8*5] - movsd xmm12, qword ptr [rsp + 32 + 8*6] - movsd xmm13, qword ptr [rsp + 32 + 8*7] - movsd xmm14, qword ptr [rsp + 32 + 8*8] - movsd xmm15, qword ptr [rsp + 32 + 8*9] - add rsp, 8*10 + 32 + 8 + movaps xmm6, xmmword ptr [rsp + 32 + 16*0] + movaps xmm7, xmmword ptr [rsp + 32 + 16*1] + movaps xmm8, xmmword ptr [rsp + 32 + 16*2] + movaps xmm9, xmmword ptr [rsp + 32 + 16*3] + movaps xmm10, xmmword ptr [rsp + 32 + 16*4] + movaps xmm11, xmmword ptr [rsp + 32 + 16*5] + movaps xmm12, xmmword ptr [rsp + 32 + 16*6] + movaps xmm13, xmmword ptr [rsp + 32 + 16*7] + movaps xmm14, xmmword ptr [rsp + 32 + 16*8] + movaps xmm15, xmmword ptr [rsp + 32 + 16*9] + add rsp, 16*10 + 32 + 8 ret execute_ex ENDP