Skip to content

Commit d56253c

Browse files
authored
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
1 parent 0bc0e31 commit d56253c

1 file changed

Lines changed: 13 additions & 18 deletions

File tree

ext/phar/phar_object.c

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,8 +1081,9 @@ static const spl_other_handler phar_spl_foreign_handler = {
10811081
*/
10821082
PHP_METHOD(Phar, __construct)
10831083
{
1084-
char *fname, *alias = NULL, *error, *save_fname;
1085-
size_t fname_len, alias_len = 0;
1084+
zend_string *fname;
1085+
char *alias = NULL, *error;
1086+
size_t alias_len = 0;
10861087
bool is_data;
10871088
zend_long flags = SPL_FILE_DIR_SKIPDOTS|SPL_FILE_DIR_UNIXPATHS;
10881089
zend_long format = 0;
@@ -1095,11 +1096,11 @@ PHP_METHOD(Phar, __construct)
10951096
is_data = instanceof_function(Z_OBJCE_P(ZEND_THIS), phar_ce_data);
10961097

10971098
if (is_data) {
1098-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|ls!l", &fname, &fname_len, &flags, &alias, &alias_len, &format) == FAILURE) {
1099+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|ls!l", &fname, &flags, &alias, &alias_len, &format) == FAILURE) {
10991100
RETURN_THROWS();
11001101
}
11011102
} else {
1102-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|ls!", &fname, &fname_len, &flags, &alias, &alias_len) == FAILURE) {
1103+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|ls!", &fname, &flags, &alias, &alias_len) == FAILURE) {
11031104
RETURN_THROWS();
11041105
}
11051106
}
@@ -1109,23 +1110,22 @@ PHP_METHOD(Phar, __construct)
11091110
RETURN_THROWS();
11101111
}
11111112

1112-
save_fname = fname;
11131113
zend_string *entry = NULL;
11141114
/* phar_split_fname() will unixify the path */
1115-
zend_string *arch = phar_split_fname(fname, fname_len, &entry, !is_data, 2);
1115+
zend_string *arch = phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), &entry, !is_data, 2);
11161116
if (arch) {
11171117
/* use arch (the basename for the archive) for fname instead of fname */
11181118
/* this allows support for RecursiveDirectoryIterator of subdirectories */
1119-
fname = ZSTR_VAL(arch);
1120-
fname_len = ZSTR_LEN(arch);
1119+
fname = arch;
11211120
}
11221121

1123-
if (phar_open_or_create_filename(fname, fname_len, alias, alias_len, is_data, REPORT_ERRORS, &phar_data, &error) == FAILURE) {
1122+
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);
11241123

1125-
if (arch && fname == ZSTR_VAL(arch) && fname != save_fname) {
1126-
zend_string_release_ex(arch, false);
1127-
fname = save_fname;
1128-
}
1124+
if (arch) {
1125+
zend_string_release_ex(arch, false);
1126+
}
1127+
1128+
if (phar_status == FAILURE) {
11291129

11301130
if (entry) {
11311131
zend_string_release_ex(entry, false);
@@ -1148,11 +1148,6 @@ PHP_METHOD(Phar, __construct)
11481148
phar_data->is_tar = false;
11491149
}
11501150

1151-
if (arch && fname == ZSTR_VAL(arch)) {
1152-
zend_string_release_ex(arch, false);
1153-
fname = save_fname;
1154-
}
1155-
11561151
if ((is_data && !phar_data->is_data) || (!is_data && phar_data->is_data)) {
11571152
if (is_data) {
11581153
zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,

0 commit comments

Comments
 (0)