Commit 60314974f98 for php.net
commit 60314974f98caa8693c2491b1186dfc038ead7e6
Author: Gina Peter Banyard <girgias@php.net>
Date: Fri Apr 17 00:11:28 2026 +0100
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.
diff --git a/ext/phar/phar.c b/ext/phar/phar.c
index d597434d5eb..5fb6c864be7 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 c20e5d42b31..a60c5ed5d43 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 ef997184d03..f97240010d4 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 aee0fc71c60..ef356bfc7a2 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 1e9fedbcbb2..8af0c488f5c 100644
--- a/ext/phar/util.c
+++ b/ext/phar/util.c
@@ -34,7 +34,7 @@
#include <openssl/ssl.h>
#include <openssl/pkcs12.h>
#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 e6a8cdad324..f757adc90c8 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);