Commit 32a9fcc8e59 for php.net

commit 32a9fcc8e59b880979229ea9f411ebedabfb6131
Author: Gina Peter Banyard <girgias@php.net>
Date:   Thu Apr 30 15:00:10 2026 +0100

    ext/phar: use zend_string for alias arg of phar_open_or_create_filename()

diff --git a/ext/phar/phar.c b/ext/phar/phar.c
index 38c4bb26ff8..f144a8f5c28 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 5054699a8cb..0b4a29ca43b 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 260214cc368..81c4fd14f7b 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 29ce9ea9077..772f9c2769a 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)) {