From eb763fbdf5b4574e222808adbcaffd650a469be0 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 16 Apr 2026 22:45:09 +0100 Subject: [PATCH 1/2] ext/phar: arch variable is only needed once in phar_file_stat() (#21780) This removes an allocation and cleans up the logic of freeing the arch we retrieve from phar_split_fname() --- ext/phar/func_interceptors.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/ext/phar/func_interceptors.c b/ext/phar/func_interceptors.c index e70dcb5e5a14..0e7d2df0db61 100644 --- a/ext/phar/func_interceptors.c +++ b/ext/phar/func_interceptors.c @@ -475,8 +475,6 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ } if (!IS_ABSOLUTE_PATH(filename, filename_length) && !strstr(filename, "://")) { - char *arch; - size_t arch_len; zend_string *fname; zend_stat_t sb = {0}; phar_archive_data *phar; @@ -490,16 +488,17 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ } if (PHAR_G(last_phar) && ZSTR_LEN(fname) - 7 >= PHAR_G(last_phar_name_len) && !memcmp(ZSTR_VAL(fname) + 7, PHAR_G(last_phar_name), PHAR_G(last_phar_name_len))) { - arch = estrndup(PHAR_G(last_phar_name), PHAR_G(last_phar_name_len)); - arch_len = PHAR_G(last_phar_name_len); /* fopen within phar, if :// is not in the url, then prepend phar:/// */ phar = PHAR_G(last_phar); goto splitted; } + char *arch; + size_t arch_len; if (SUCCESS == phar_split_fname(ZSTR_VAL(fname), ZSTR_LEN(fname), &arch, &arch_len, NULL, 2, 0)) { /* fopen within phar, if :// is not in the url, then prepend phar:/// */ - if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL)) { - efree(arch); + zend_result has_archive = phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL); + efree(arch); + if (FAILURE == has_archive) { goto skip_phar; } splitted:; @@ -520,7 +519,6 @@ splitted:; } if (zend_hash_exists(&(phar->virtual_dirs), entry)) { zend_string_release_ex(entry, false); - efree(arch); if (IS_EXISTS_CHECK(type)) { RETURN_TRUE; } @@ -550,7 +548,6 @@ splitted:; PHAR_G(cwd_len) = save_len; zend_string_release_ex(entry, false); if (IS_EXISTS_CHECK(type)) { - efree(arch); RETURN_TRUE; } goto stat_entry; @@ -559,7 +556,6 @@ splitted:; PHAR_G(cwd) = save; PHAR_G(cwd_len) = save_len; zend_string_release_ex(entry, false); - efree(arch); if (IS_EXISTS_CHECK(type)) { RETURN_TRUE; } @@ -574,7 +570,6 @@ splitted:; PHAR_G(cwd) = save; PHAR_G(cwd_len) = save_len; zend_string_release_ex(entry, false); - efree(arch); /* Error Occurred */ if (!IS_EXISTS_CHECK(type)) { php_error_docref(NULL, E_WARNING, "%sstat failed for %s", IS_LINK_OPERATION(type) ? "L" : "", filename); @@ -582,7 +577,6 @@ splitted:; RETURN_FALSE; } stat_entry: - efree(arch); if (!data->is_dir) { sb.st_size = data->uncompressed_filesize; sb.st_mode = data->flags & PHAR_ENT_PERM_MASK; From 60314974f98caa8693c2491b1186dfc038ead7e6 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 17 Apr 2026 00:11:28 +0100 Subject: [PATCH 2/2] ext/phar: add const qualifiers (#21779) This is probably going to be round 1 of a few different iterations of adding const qualifiers after figuring out more of the extension code. --- ext/phar/phar.c | 10 ++++++---- ext/phar/phar_internal.h | 20 ++++++++++---------- ext/phar/phar_object.c | 11 +++++++---- ext/phar/tar.c | 6 +++--- ext/phar/util.c | 40 +++++++++++++++++++++------------------- ext/phar/zip.c | 8 ++++---- 6 files changed, 51 insertions(+), 44 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index d597434d5eb3..5fb6c864be74 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -256,7 +256,8 @@ bool phar_archive_delref(phar_archive_data *phar) /* {{{ */ } else if (!phar->refcount) { /* invalidate phar cache */ PHAR_G(last_phar) = NULL; - PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL; + PHAR_G(last_alias) = NULL; + PHAR_G(last_phar_name) = NULL; /* This is a new phar that has perhaps had an alias/metadata set, but has never been flushed. */ bool remove_fname_cache = !zend_hash_num_elements(&phar->manifest); @@ -1263,7 +1264,7 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname } if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) { - if (SUCCESS != phar_free_alias(fd_ptr, alias, alias_len)) { + if (SUCCESS != phar_free_alias(fd_ptr)) { signature = NULL; fp = NULL; MAPPHAR_FAIL("Cannot open archive \"%s\", alias is already in use by existing archive"); @@ -1462,7 +1463,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_create_or_parse_filename(c phar_archive_data *fd_ptr; if (alias && NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) { - if (SUCCESS != phar_free_alias(fd_ptr, alias, alias_len)) { + if (SUCCESS != phar_free_alias(fd_ptr)) { spprintf(error, 4096, "phar error: phar \"%s\" cannot set alias \"%s\", already in use by another phar archive", mydata->fname, alias); zend_hash_str_del(&(PHAR_G(phar_fname_map)), mydata->fname, fname_len); @@ -3333,7 +3334,8 @@ void phar_request_initialize(void) /* {{{ */ if (!PHAR_G(request_init)) { PHAR_G(last_phar) = NULL; - PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL; + PHAR_G(last_alias) = NULL; + PHAR_G(last_phar_name) = NULL; PHAR_G(has_bz2) = zend_hash_str_exists(&module_registry, "bz2", sizeof("bz2")-1); PHAR_G(has_zlib) = zend_hash_str_exists(&module_registry, "zlib", sizeof("zlib")-1); PHAR_G(request_init) = 1; diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index c20e5d42b313..a60c5ed5d432 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -149,7 +149,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phar) char* last_phar_name; uint32_t last_phar_name_len; uint32_t last_alias_len; - char* last_alias; + const char* last_alias; phar_archive_data* last_phar; HashTable mime_types; ZEND_END_MODULE_GLOBALS(phar) @@ -398,7 +398,7 @@ static inline void phar_set_inode(phar_entry_info *entry) /* {{{ */ } /* }}} */ -static inline bool phar_entry_can_remove(phar_entry_info *entry) +static inline bool phar_entry_can_remove(const phar_entry_info *entry) { return entry->fp_refcount == 0 && entry->fileinfo_lock_count == 0; } @@ -413,9 +413,9 @@ zend_result phar_open_from_filename(char *fname, size_t fname_len, char *alias, ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_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, 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(3) zend_result phar_open_executed_filename(char *alias, size_t alias_len, char **error); -zend_result phar_free_alias(phar_archive_data *phar, char *alias, size_t alias_len); -zend_result phar_get_archive(phar_archive_data **archive, char *fname, size_t fname_len, char *alias, size_t alias_len, char **error); -zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, char *sig, size_t sig_len, char *fname, char **signature, size_t *signature_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); +zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, char *sig, size_t sig_len, const char *fname, char **signature, size_t *signature_len, char **error); ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar, php_stream *fp, char **signature, size_t *signature_length, char **error); /* utility functions */ @@ -424,8 +424,8 @@ const char *phar_decompress_filter(const phar_entry_info *entry, bool return_unk const char *phar_compress_filter(const phar_entry_info *entry, bool return_unknown); /* void phar_remove_virtual_dirs(phar_archive_data *phar, char *filename, size_t filename_len); */ -void phar_add_virtual_dirs(phar_archive_data *phar, char *filename, size_t filename_len); -zend_result phar_mount_entry(phar_archive_data *phar, char *filename, size_t filename_len, char *path, size_t path_len); +void phar_add_virtual_dirs(phar_archive_data *phar, const char *filename, size_t filename_len); +zend_result phar_mount_entry(phar_archive_data *phar, const char *filename, size_t filename_len, char *path, size_t path_len); zend_string *phar_find_in_include_path(zend_string *file, phar_archive_data **pphar); zend_string* phar_fix_filepath(const char *path, size_t path_length, bool use_cwd); ZEND_ATTRIBUTE_NONNULL phar_entry_info * phar_open_jit(const phar_archive_data *phar, phar_entry_info *entry, char **error); @@ -448,12 +448,12 @@ zend_result phar_copy_on_write(phar_archive_data **pphar); /* tar functions in tar.c */ bool phar_is_tar(const char *buf, const char *fname); -zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error); +zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_tar(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, 4) int phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error); /* zip functions in zip.c */ -zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, char **error); +zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, char **error); ZEND_ATTRIBUTE_NONNULL_ARGS(1, 7, 8) zend_result phar_open_or_create_zip(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, 4) int phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error); @@ -470,7 +470,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 zend_result phar_get_entry_data(phar_entry_data **ret, 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 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); zend_result phar_detect_phar_fname_ext(const char *filename, size_t filename_len, const char **ext_str, size_t *ext_len, int executable, int for_create, bool is_complete); diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index ef997184d03d..f97240010d48 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -1313,7 +1313,8 @@ PHP_METHOD(Phar, unlinkArchive) /* invalidate phar cache */ PHAR_G(last_phar) = NULL; - PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL; + PHAR_G(last_alias) = NULL; + PHAR_G(last_phar_name) = NULL; phar_archive_delref(phar); unlink(fname); @@ -2216,7 +2217,8 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert /* invalidate phar cache */ PHAR_G(last_phar) = NULL; - PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL; + PHAR_G(last_alias) = NULL; + PHAR_G(last_phar_name) = NULL; php_stream *tmp_fp = php_stream_fopen_tmpfile(); if (tmp_fp == NULL) { @@ -2688,7 +2690,8 @@ PHP_METHOD(Phar, setAlias) /* invalidate phar cache */ PHAR_G(last_phar) = NULL; - PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL; + PHAR_G(last_alias) = NULL; + PHAR_G(last_phar_name) = NULL; if (phar_obj->archive->is_data) { if (phar_obj->archive->is_tar) { @@ -2705,7 +2708,7 @@ PHP_METHOD(Phar, setAlias) RETURN_TRUE; } if (NULL != (fd_ptr = zend_hash_find_ptr(&(PHAR_G(phar_alias_map)), new_alias))) { - if (SUCCESS != phar_free_alias(fd_ptr, ZSTR_VAL(new_alias), ZSTR_LEN(new_alias))) { + if (SUCCESS != phar_free_alias(fd_ptr)) { zend_throw_exception_ex(phar_ce_PharException, 0, "alias \"%s\" is already used for archive \"%s\" and cannot be used for other archives", ZSTR_VAL(new_alias), fd_ptr->fname); RETURN_THROWS(); } diff --git a/ext/phar/tar.c b/ext/phar/tar.c index aee0fc71c601..ef356bfc7a28 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -197,7 +197,7 @@ static zend_result phar_tar_process_metadata(phar_entry_info *entry, php_stream } /* }}} */ -zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error) /* {{{ */ +zend_result phar_parse_tarfile(php_stream* fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, uint32_t compression, char **error) /* {{{ */ { char buf[512], *actual_alias = NULL, *p; phar_entry_info entry = {0}; @@ -663,7 +663,7 @@ zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, ch myphar->is_temporary_alias = 0; if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), actual_alias, myphar->alias_len))) { - if (SUCCESS != phar_free_alias(fd_ptr, actual_alias, myphar->alias_len)) { + if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { spprintf(error, 4096, "phar error: Unable to add tar-based phar \"%s\", alias is already in use", fname); } @@ -678,7 +678,7 @@ zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, ch if (alias_len) { if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) { - if (SUCCESS != phar_free_alias(fd_ptr, alias, alias_len)) { + if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { spprintf(error, 4096, "phar error: Unable to add tar-based phar \"%s\", alias is already in use", fname); } diff --git a/ext/phar/util.c b/ext/phar/util.c index 1e9fedbcbb23..8af0c488f5ca 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -34,7 +34,7 @@ #include #include #else -static zend_result phar_call_openssl_signverify(bool is_sign, php_stream *fp, zend_off_t end, char *key, size_t key_len, char **signature, size_t *signature_len, uint32_t sig_type); +static zend_result phar_call_openssl_signverify(bool is_sign, php_stream *fp, zend_off_t end, const char *key, size_t key_len, char **signature, size_t *signature_len, uint32_t sig_type); #endif /* for links to relative location, prepend cwd of the entry */ @@ -188,7 +188,7 @@ int phar_seek_efp(phar_entry_info *entry, zend_off_t offset, int whence, zend_of /* }}} */ /* mount an absolute path or uri to a path internal to the phar archive */ -zend_result phar_mount_entry(phar_archive_data *phar, char *filename, size_t filename_len, char *path, size_t path_len) /* {{{ */ +zend_result phar_mount_entry(phar_archive_data *phar, const char *filename, size_t filename_len, char *path, size_t path_len) /* {{{ */ { phar_entry_info entry = {0}; php_stream_statbuf ssb; @@ -462,7 +462,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result phar_separate_entry_fp(phar_entry_info * appended, truncated, or read. For read, if the entry is marked unmodified, it is * assumed that the file pointer, if present, is opened for reading */ -ZEND_ATTRIBUTE_NONNULL zend_result phar_get_entry_data(phar_entry_data **ret, 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 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) /* {{{ */ { phar_archive_data *phar; phar_entry_info *entry; @@ -929,7 +929,7 @@ ZEND_ATTRIBUTE_NONNULL phar_entry_info * phar_open_jit(const phar_archive_data * } /* }}} */ -zend_result phar_free_alias(phar_archive_data *phar, char *alias, size_t alias_len) /* {{{ */ +zend_result phar_free_alias(const phar_archive_data *phar) /* {{{ */ { if (phar->refcount || phar->is_persistent) { return FAILURE; @@ -942,7 +942,8 @@ zend_result phar_free_alias(phar_archive_data *phar, char *alias, size_t alias_l /* invalidate phar cache */ PHAR_G(last_phar) = NULL; - PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL; + PHAR_G(last_alias) = NULL; + PHAR_G(last_phar_name) = NULL; return SUCCESS; } @@ -952,11 +953,10 @@ zend_result phar_free_alias(phar_archive_data *phar, char *alias, size_t alias_l * Looks up a phar archive in the filename map, connecting it to the alias * (if any) or returns null */ -zend_result phar_get_archive(phar_archive_data **archive, char *fname, size_t fname_len, char *alias, size_t alias_len, char **error) /* {{{ */ +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) /* {{{ */ { phar_archive_data *fd, *fd_ptr; - char *my_realpath, *save; - size_t save_len; + char *my_realpath; phar_request_initialize(); @@ -1003,7 +1003,7 @@ zend_result phar_get_archive(phar_archive_data **archive, char *fname, size_t fn if (error) { spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, fd_ptr->fname, fname); } - if (SUCCESS == phar_free_alias(fd_ptr, alias, alias_len)) { + if (SUCCESS == phar_free_alias(fd_ptr)) { if (error) { efree(*error); *error = NULL; @@ -1029,8 +1029,8 @@ zend_result phar_get_archive(phar_archive_data **archive, char *fname, size_t fn } my_realpath = NULL; - save = fname; - save_len = fname_len; + const char *save = fname; + size_t save_len = fname_len; if (fname && fname_len) { if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len))) { @@ -1113,14 +1113,15 @@ zend_result phar_get_archive(phar_archive_data **archive, char *fname, size_t fn my_realpath = expand_filepath(fname, my_realpath); if (my_realpath) { - fname_len = strlen(my_realpath); + size_t my_realpath_len = strlen(my_realpath); +#ifdef PHP_WIN32 + phar_unixify_path_separators(my_realpath, my_realpath_len); +#endif + fname_len = my_realpath_len; fname = my_realpath; } else { return FAILURE; } -#ifdef PHP_WIN32 - phar_unixify_path_separators(fname, fname_len); -#endif if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_fname_map)), fname, fname_len))) { realpath_success: @@ -1382,7 +1383,7 @@ static int phar_hex_str(const char *digest, size_t digest_len, char **signature) /* }}} */ #ifndef PHAR_HAVE_OPENSSL -static zend_result phar_call_openssl_signverify(bool is_sign, php_stream *fp, zend_off_t end, char *key, size_t key_len, char **signature, size_t *signature_len, uint32_t sig_type) /* {{{ */ +static zend_result phar_call_openssl_signverify(bool is_sign, php_stream *fp, zend_off_t end, const char *key, size_t key_len, char **signature, size_t *signature_len, uint32_t sig_type) /* {{{ */ { zval retval, zp[4]; zend_string *str; @@ -1473,7 +1474,7 @@ static zend_result phar_call_openssl_signverify(bool is_sign, php_stream *fp, ze /* }}} */ #endif /* #ifndef PHAR_HAVE_OPENSSL */ -zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, char *sig, size_t sig_len, char *fname, char **signature, size_t *signature_len, char **error) /* {{{ */ +zend_result phar_verify_signature(php_stream *fp, size_t end_of_phar, uint32_t sig_type, char *sig, size_t sig_len, const char *fname, char **signature, size_t *signature_len, char **error) /* {{{ */ { size_t read_size, len; zend_off_t read_len; @@ -1959,7 +1960,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result phar_create_signature(phar_archive_data *phar /* }}} */ // TODO: convert this to zend_string too -void phar_add_virtual_dirs(phar_archive_data *phar, char *filename, size_t filename_len) /* {{{ */ +void phar_add_virtual_dirs(phar_archive_data *phar, const char *filename, size_t filename_len) /* {{{ */ { const char *s; zend_string *str; @@ -2074,7 +2075,8 @@ zend_result phar_copy_on_write(phar_archive_data **pphar) /* {{{ */ newpphar = Z_PTR_P(pzv); /* invalidate phar cache */ PHAR_G(last_phar) = NULL; - PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL; + PHAR_G(last_alias) = NULL; + PHAR_G(last_phar_name) = NULL; if (newpphar->alias_len && NULL == zend_hash_str_add_ptr(&(PHAR_G(phar_alias_map)), newpphar->alias, newpphar->alias_len, newpphar)) { zend_hash_str_del(&(PHAR_G(phar_fname_map)), (*pphar)->fname, (*pphar)->fname_len); diff --git a/ext/phar/zip.c b/ext/phar/zip.c index e6a8cdad324a..f757adc90c88 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -224,7 +224,7 @@ static char *phar_find_eocd(const char *s, size_t n) * This is used by phar_open_from_fp to process a zip-based phar, but can be called * directly. */ -zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, char **error) /* {{{ */ +zend_result phar_parse_zipfile(php_stream *fp, const char *fname, size_t fname_len, const char *alias, size_t alias_len, phar_archive_data** pphar, char **error) /* {{{ */ { phar_zip_dir_end locator; char buf[sizeof(locator) + 65536]; @@ -740,7 +740,7 @@ zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, ch mydata->is_temporary_alias = 0; if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), actual_alias, mydata->alias_len))) { - if (SUCCESS != phar_free_alias(fd_ptr, actual_alias, mydata->alias_len)) { + if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { spprintf(error, 4096, "phar error: Unable to add zip-based phar \"%s\" with implicit alias, alias is already in use", fname); } @@ -762,7 +762,7 @@ zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, ch if (alias_len) { if (NULL != (fd_ptr = zend_hash_str_find_ptr(&(PHAR_G(phar_alias_map)), alias, alias_len))) { - if (SUCCESS != phar_free_alias(fd_ptr, alias, alias_len)) { + if (SUCCESS != phar_free_alias(fd_ptr)) { if (error) { spprintf(error, 4096, "phar error: Unable to add zip-based phar \"%s\" with explicit alias, alias is already in use", fname); } @@ -1279,7 +1279,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, ze /* set stub */ if (user_stub && !is_default_stub) { - char *pos = php_stristr(ZSTR_VAL(user_stub), halt_stub, ZSTR_LEN(user_stub), strlen(halt_stub)); + const char *pos = php_stristr(ZSTR_VAL(user_stub), halt_stub, ZSTR_LEN(user_stub), strlen(halt_stub)); if (pos == NULL) { spprintf(error, 0, "illegal stub for zip-based phar \"%s\"", phar->fname);