Commit 20b0ff73af8 for php.net
commit 20b0ff73af8303d83b00429fdd14e10315795f95
Author: Gina Peter Banyard <girgias@php.net>
Date: Thu Apr 23 19:10:18 2026 +0100
ext/phar: refactor phar_get_or_create_entry_data() to use a zend_string* for fname (#21854)
diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h
index 4afe485ddf7..3ca4ac1ac16 100644
--- a/ext/phar/phar_internal.h
+++ b/ext/phar/phar_internal.h
@@ -466,7 +466,7 @@ void phar_entry_delref(phar_entry_data *idata);
phar_entry_info *phar_get_entry_info(phar_archive_data *phar, char *path, size_t path_len, char **error, bool security);
phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, size_t path_len, char dir, char **error, bool security);
-ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security, uint32_t timestamp);
+ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(zend_string *fname, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security, uint32_t timestamp);
ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, const char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security);
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
ZEND_ATTRIBUTE_NONNULL int phar_flush(phar_archive_data *archive, char **error);
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c
index 3cf1b7fb39d..d703de9e841 100644
--- a/ext/phar/phar_object.c
+++ b/ext/phar/phar_object.c
@@ -1368,7 +1368,7 @@ static phar_entry_data *phar_build_entry_data(zend_string *fname, char *path, si
timestamp = time(NULL);
}
- return phar_get_or_create_entry_data(ZSTR_VAL(fname), ZSTR_LEN(fname), path, path_len, "w+b", 0, error, true, timestamp);
+ return phar_get_or_create_entry_data(fname, path, path_len, "w+b", 0, error, true, timestamp);
}
static int phar_build(zend_object_iterator *iter, void *puser) /* {{{ */
@@ -3593,7 +3593,7 @@ static void phar_add_file(phar_archive_data **pphar, zend_string *file_name, con
}
#endif
- phar_entry_data *data = phar_get_or_create_entry_data(ZSTR_VAL((*pphar)->fname), ZSTR_LEN((*pphar)->fname), filename, filename_len, "w+b", 0, &error, true, time(NULL));
+ phar_entry_data *data = phar_get_or_create_entry_data((*pphar)->fname, filename, filename_len, "w+b", 0, &error, true, time(NULL));
if (!data) {
if (error) {
zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s does not exist and cannot be created: %s", filename, error);
@@ -3668,7 +3668,7 @@ static void phar_mkdir(phar_archive_data **pphar, zend_string *dir_name)
char *error;
phar_entry_data *data = phar_get_or_create_entry_data(
- ZSTR_VAL((*pphar)->fname), ZSTR_LEN((*pphar)->fname),
+ (*pphar)->fname,
ZSTR_VAL(dir_name), ZSTR_LEN(dir_name),
"w+b", 2, &error, true,
time(NULL)
diff --git a/ext/phar/stream.c b/ext/phar/stream.c
index a9c4dc98d7d..c56c100d52f 100644
--- a/ext/phar/stream.c
+++ b/ext/phar/stream.c
@@ -189,7 +189,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
/* strip leading "/" */
internal_file = estrndup(ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1);
if (mode[0] == 'w' || (mode[0] == 'r' && mode[1] == '+')) {
- if (NULL == (idata = phar_get_or_create_entry_data(ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), internal_file, strlen(internal_file), mode, 0, &error, true, time(NULL)))) {
+ if (NULL == (idata = phar_get_or_create_entry_data(resource->host, internal_file, strlen(internal_file), mode, 0, &error, true, time(NULL)))) {
if (error) {
php_stream_wrapper_log_error(wrapper, options, "%s", error);
efree(error);
diff --git a/ext/phar/util.c b/ext/phar/util.c
index 136dae4f882..9db0ba42a7f 100644
--- a/ext/phar/util.c
+++ b/ext/phar/util.c
@@ -611,7 +611,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, co
/**
* Create a new dummy file slot within a writeable phar for a newly created file
*/
-ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fname, size_t fname_len, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security, uint32_t timestamp) /* {{{ */
+ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(zend_string *fname, char *path, size_t path_len, const char *mode, char allow_dir, char **error, bool security, uint32_t timestamp) /* {{{ */
{
phar_archive_data *phar;
phar_entry_info etemp;
@@ -625,11 +625,11 @@ ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fnam
is_dir = (path_len && path[path_len - 1] == '/') ? 1 : 0;
- if (FAILURE == phar_get_archive(&phar, fname, fname_len, NULL, 0, error)) {
+ if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(fname), ZSTR_LEN(fname), NULL, 0, error)) {
return NULL;
}
- if (FAILURE == phar_get_entry_data(&ret, fname, fname_len, path, path_len, mode, allow_dir, error, security)) {
+ if (FAILURE == phar_get_entry_data(&ret, ZSTR_VAL(fname), ZSTR_LEN(fname), path, path_len, mode, allow_dir, error, security)) {
return NULL;
} else if (ret) {
return ret;
@@ -641,7 +641,7 @@ ZEND_ATTRIBUTE_NONNULL phar_entry_data *phar_get_or_create_entry_data(char *fnam
}
if (phar->is_persistent && FAILURE == phar_copy_on_write(&phar)) {
- spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be created, could not make cached phar writeable", path, fname);
+ spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be created, could not make cached phar writeable", path, ZSTR_VAL(fname));
return NULL;
}