Commit d56253ca6e8 for php.net
commit d56253ca6e80de4c44ec2876dc0c6bdd7dd07c32
Author: Gina Peter Banyard <girgias@php.net>
Date: Thu Apr 23 17:31:57 2026 +0100
ext/phar: refactor Phar::__construct() to use zend_string* (#21838)
Also clean-up the freeing code for the arch zend_string, we don't need to actually save the fname zend_string as it is not used afterwards
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c
index d356c61ea5d..7380385f110 100644
--- a/ext/phar/phar_object.c
+++ b/ext/phar/phar_object.c
@@ -1081,8 +1081,9 @@ static const spl_other_handler phar_spl_foreign_handler = {
*/
PHP_METHOD(Phar, __construct)
{
- char *fname, *alias = NULL, *error, *save_fname;
- size_t fname_len, alias_len = 0;
+ zend_string *fname;
+ char *alias = NULL, *error;
+ size_t alias_len = 0;
bool is_data;
zend_long flags = SPL_FILE_DIR_SKIPDOTS|SPL_FILE_DIR_UNIXPATHS;
zend_long format = 0;
@@ -1095,11 +1096,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, &fname_len, &flags, &alias, &alias_len, &format) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|ls!l", &fname, &flags, &alias, &alias_len, &format) == FAILURE) {
RETURN_THROWS();
}
} else {
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|ls!", &fname, &fname_len, &flags, &alias, &alias_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|ls!", &fname, &flags, &alias, &alias_len) == FAILURE) {
RETURN_THROWS();
}
}
@@ -1109,23 +1110,22 @@ PHP_METHOD(Phar, __construct)
RETURN_THROWS();
}
- save_fname = fname;
zend_string *entry = NULL;
/* phar_split_fname() will unixify the path */
- zend_string *arch = phar_split_fname(fname, fname_len, &entry, !is_data, 2);
+ zend_string *arch = phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), &entry, !is_data, 2);
if (arch) {
/* use arch (the basename for the archive) for fname instead of fname */
/* this allows support for RecursiveDirectoryIterator of subdirectories */
- fname = ZSTR_VAL(arch);
- fname_len = ZSTR_LEN(arch);
+ fname = arch;
}
- if (phar_open_or_create_filename(fname, fname_len, alias, alias_len, is_data, REPORT_ERRORS, &phar_data, &error) == FAILURE) {
+ zend_result phar_status = phar_open_or_create_filename(ZSTR_VAL(fname), ZSTR_LEN(fname), alias, alias_len, is_data, REPORT_ERRORS, &phar_data, &error);
- if (arch && fname == ZSTR_VAL(arch) && fname != save_fname) {
- zend_string_release_ex(arch, false);
- fname = save_fname;
- }
+ if (arch) {
+ zend_string_release_ex(arch, false);
+ }
+
+ if (phar_status == FAILURE) {
if (entry) {
zend_string_release_ex(entry, false);
@@ -1148,11 +1148,6 @@ PHP_METHOD(Phar, __construct)
phar_data->is_tar = false;
}
- if (arch && fname == ZSTR_VAL(arch)) {
- zend_string_release_ex(arch, false);
- fname = save_fname;
- }
-
if ((is_data && !phar_data->is_data) || (!is_data && phar_data->is_data)) {
if (is_data) {
zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,