Commit 34a9274b22e for php.net
commit 34a9274b22e6b8fc5b8c1a2079801dc792dca648
Author: Gina Peter Banyard <girgias@php.net>
Date: Wed Apr 22 05:51:03 2026 +0100
ext/phar: refactor phar_create_or_parse_filename() to use a zend_string* for fname
diff --git a/ext/phar/phar.c b/ext/phar/phar.c
index 5747b019916..2ab799ab8c8 100644
--- a/ext/phar/phar.c
+++ b/ext/phar/phar.c
@@ -1363,32 +1363,32 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_open_or_create_filename(ze
return phar_open_or_create_tar(fname, alias, alias_len, is_data, options, pphar, error);
}
- return phar_create_or_parse_filename(ZSTR_VAL(fname), ZSTR_LEN(fname), alias, alias_len, is_data, options, pphar, error);
+ return phar_create_or_parse_filename(fname, alias, alias_len, is_data, options, pphar, error);
}
/* }}} */
static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_len, char *alias, size_t alias_len, uint32_t options, phar_archive_data** pphar, char **error);
-ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, 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, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
{
php_stream *fp;
zend_string *actual = NULL;
+ zend_string *save_fname = fname;
char *p;
- if (php_check_open_basedir(fname)) {
+ if (php_check_open_basedir(ZSTR_VAL(fname))) {
return FAILURE;
}
/* first open readonly so it won't be created if not present */
- fp = php_stream_open_wrapper(fname, "rb", IGNORE_URL|STREAM_MUST_SEEK|0, &actual);
+ fp = php_stream_open_wrapper(ZSTR_VAL(fname), "rb", IGNORE_URL|STREAM_MUST_SEEK|0, &actual);
if (actual) {
- fname = ZSTR_VAL(actual);
- fname_len = ZSTR_LEN(actual);
+ fname = actual;
}
if (fp) {
- if (phar_open_from_fp(fp, fname, fname_len, alias, alias_len, options, pphar, error) == SUCCESS) {
+ if (phar_open_from_fp(fp, ZSTR_VAL(fname), ZSTR_LEN(fname), alias, alias_len, options, pphar, error) == SUCCESS) {
if ((*pphar)->is_data || !PHAR_G(readonly)) {
(*pphar)->is_writeable = 1;
}
@@ -1407,11 +1407,12 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(c
if (actual) {
zend_string_release_ex(actual, 0);
+ fname = save_fname;
}
if (PHAR_G(readonly) && !is_data) {
if (options & REPORT_ERRORS) {
- spprintf(error, 0, "creating archive \"%s\" disabled by the php.ini setting phar.readonly", fname);
+ spprintf(error, 0, "creating archive \"%s\" disabled by the php.ini setting phar.readonly", ZSTR_VAL(fname));
}
return FAILURE;
}
@@ -1419,7 +1420,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(c
/* set up our manifest */
phar_archive_data *mydata = ecalloc(1, sizeof(phar_archive_data));
/* TODO: prevent reallocation via a new expand_filepath() API? */
- char *new_fname = expand_filepath(fname, NULL);
+ char *new_fname = expand_filepath(ZSTR_VAL(fname), NULL);
if (new_fname == NULL) {
efree(mydata);
return FAILURE;
@@ -1484,7 +1485,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(c
if (alias_len && alias) {
if (NULL == zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len, mydata)) {
if (options & REPORT_ERRORS) {
- spprintf(error, 0, "archive \"%s\" cannot be associated with alias \"%s\", already in use", fname, alias);
+ spprintf(error, 0, "archive \"%s\" cannot be associated with alias \"%s\", already in use", ZSTR_VAL(fname), alias);
}
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 181ca2c0710..36fa2b54350 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, 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_open_or_create_filename(zend_string *fname, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
-ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(char *fname, size_t fname_len, char *alias, size_t alias_len, 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, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error);
ZEND_ATTRIBUTE_NONNULL_ARGS(3) zend_result phar_open_executed_filename(char *alias, size_t alias_len, char **error);
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);
diff --git a/ext/phar/tar.c b/ext/phar/tar.c
index 1ba7d26216e..a7c02e35273 100644
--- a/ext/phar/tar.c
+++ b/ext/phar/tar.c
@@ -129,7 +129,7 @@ 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, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
{
phar_archive_data *phar;
- zend_result ret = phar_create_or_parse_filename(ZSTR_VAL(fname), ZSTR_LEN(fname), alias, alias_len, is_data, options, &phar, error);
+ zend_result ret = phar_create_or_parse_filename(fname, alias, alias_len, is_data, options, &phar, error);
if (FAILURE == ret) {
return FAILURE;
diff --git a/ext/phar/zip.c b/ext/phar/zip.c
index 5e742336956..28e1a3d5641 100644
--- a/ext/phar/zip.c
+++ b/ext/phar/zip.c
@@ -797,7 +797,7 @@ zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_l
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 6, 7) zend_result phar_open_or_create_zip(zend_string *fname, char *alias, size_t alias_len, bool is_data, uint32_t options, phar_archive_data** pphar, char **error) /* {{{ */
{
phar_archive_data *phar;
- zend_result ret = phar_create_or_parse_filename(ZSTR_VAL(fname), ZSTR_LEN(fname), alias, alias_len, is_data, options, &phar, error);
+ zend_result ret = phar_create_or_parse_filename(fname, alias, alias_len, is_data, options, &phar, error);
if (FAILURE == ret) {
return FAILURE;