Skip to content
Merged
6 changes: 3 additions & 3 deletions ext/phar/dirstream.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,7 +394,7 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo
return 0;
}

if ((e = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1, 2, &error, 1))) {
if ((e = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1, 2, &error, true))) {
/* directory exists, or is a subdirectory of an existing file */
if (e->is_temp_dir) {
zend_string_efree(e->filename);
Expand All @@ -412,7 +412,7 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo
return 0;
}

if (phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1, 0, &error, 1)) {
if (phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, ZSTR_LEN(resource->path) - 1, 0, &error, true)) {
/* entry exists as a file */
php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\" in phar \"%s\", file already exists", ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host));
php_url_free(resource);
Expand Down Expand Up @@ -523,7 +523,7 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options

size_t path_len = ZSTR_LEN(resource->path) - 1;

if (!(entry = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, path_len, 2, &error, 1))) {
if (!(entry = phar_get_entry_info_dir(phar, ZSTR_VAL(resource->path) + 1, path_len, 2, &error, true))) {
if (error) {
php_stream_wrapper_log_error(wrapper, options, "phar error: cannot remove directory \"%s\" in phar \"%s\", %s", ZSTR_VAL(resource->path)+1, ZSTR_VAL(resource->host), error);
efree(error);
Expand Down
49 changes: 24 additions & 25 deletions ext/phar/phar.c
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,6 @@ static zend_result phar_open_parsed_phar(char *fname, size_t fname_len, char *al
&& ((alias && fname_len == phar->fname_len
&& !strncmp(fname, phar->fname, fname_len)) || !alias)
) {
phar_entry_info *stub;
#ifdef PHP_WIN32
if (fname != save_fname) {
free_alloca(fname, fname_use_heap);
Expand All @@ -526,7 +525,7 @@ static zend_result phar_open_parsed_phar(char *fname, size_t fname_len, char *al
if (!is_data) {
/* prevent any ".phar" without a stub getting through */
if (!phar->halt_offset && !phar->is_brandnew && (phar->is_tar || phar->is_zip)) {
if (PHAR_G(readonly) && NULL == (stub = zend_hash_str_find_ptr(&(phar->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1))) {
if (PHAR_G(readonly) && !zend_hash_str_exists(&(phar->manifest), ZEND_STRL(".phar/stub.php"))) {
if (error) {
spprintf(error, 0, "'%s' is not a phar archive. Use PharData::__construct() for a standard zip or tar archive", fname);
}
Expand Down Expand Up @@ -736,7 +735,7 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname
uint32_t len;
zend_long offset;
size_t sig_len;
int register_alias = 0, temp_alias = 0;
bool register_alias = false, temp_alias = false;
char *signature = NULL;
zend_string *str;

Expand Down Expand Up @@ -1069,15 +1068,15 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname
alias_len = tmp_len;
alias = buffer;
buffer += tmp_len;
register_alias = 1;
register_alias = true;
} else if (!alias_len || !alias) {
/* if we neither have an explicit nor an implicit alias, we use the filename */
alias = NULL;
alias_len = 0;
register_alias = 0;
register_alias = false;
} else if (alias_len) {
register_alias = 1;
temp_alias = 1;
register_alias = true;
temp_alias = true;
}

/* we have 5 32-bit items plus 1 byte at least */
Expand Down Expand Up @@ -1325,12 +1324,12 @@ zend_result phar_open_or_create_filename(char *fname, size_t fname_len, char *al
}

/* first try to open an existing file */
if (phar_detect_phar_fname_ext(fname, fname_len, &ext_str, &ext_len, !is_data, 0, 1) == SUCCESS) {
if (phar_detect_phar_fname_ext(fname, fname_len, &ext_str, &ext_len, !is_data, 0, true) == SUCCESS) {
goto check_file;
}

/* next try to create a new file */
if (FAILURE == phar_detect_phar_fname_ext(fname, fname_len, &ext_str, &ext_len, !is_data, 1, 1)) {
if (FAILURE == phar_detect_phar_fname_ext(fname, fname_len, &ext_str, &ext_len, !is_data, 1, true)) {
if (error) {
if (ext_len == -2) {
spprintf(error, 0, "Cannot create a phar archive from a URL like \"%s\". Phar objects can only be created from local files", fname);
Expand All @@ -1354,8 +1353,7 @@ zend_result phar_open_or_create_filename(char *fname, size_t fname_len, char *al
}

if (PHAR_G(readonly) && !(*test)->is_data && ((*test)->is_tar || (*test)->is_zip)) {
phar_entry_info *stub;
if (NULL == (stub = zend_hash_str_find_ptr(&((*test)->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1))) {
if (!zend_hash_str_exists(&((*test)->manifest), ZEND_STRL(".phar/stub.php"))) {
spprintf(error, 0, "'%s' is not a phar archive. Use PharData::__construct() for a standard zip or tar archive", fname);
return FAILURE;
}
Expand Down Expand Up @@ -1970,7 +1968,7 @@ static zend_result phar_check_str(const char *fname, const char *ext_str, size_t
* the last parameter should be set to tell the thing to assume that filename is the full path, and only to check the
* extension rules, not to iterate.
*/
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, int is_complete) /* {{{ */
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) /* {{{ */
{
const char *pos, *slash;

Expand Down Expand Up @@ -2131,7 +2129,7 @@ static bool php_check_dots(const char *element, size_t n) /* {{{ */
/**
* Remove .. and . references within a phar filename
*/
char *phar_fix_filepath(char *path, size_t *new_len, int use_cwd) /* {{{ */
char *phar_fix_filepath(char *path, size_t *new_len, bool use_cwd) /* {{{ */
{
char *newpath;
size_t newpath_len;
Expand Down Expand Up @@ -2268,7 +2266,7 @@ zend_result phar_split_fname(const char *filename, size_t filename_len, char **a
phar_unixify_path_separators((char *)filename, filename_len);
}
#endif
if (phar_detect_phar_fname_ext(filename, filename_len, &ext_str, &ext_len, executable, for_create, 0) == FAILURE) {
if (phar_detect_phar_fname_ext(filename, filename_len, &ext_str, &ext_len, executable, for_create, false) == FAILURE) {
if (ext_len != -1) {
if (!ext_str) {
/* no / detected, restore arch for error message */
Expand Down Expand Up @@ -2544,7 +2542,8 @@ void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_defa

phar_entry_info *entry, *newentry;
size_t halt_offset;
int restore_alias_len, global_flags = 0;
uint32_t restore_alias_len;
uint32_t global_flags = 0;
bool must_close_old_file = false;
bool has_dirs = false;
char manifest[18], entry_buffer[24];
Expand Down Expand Up @@ -2747,7 +2746,7 @@ void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_defa
}
continue;
}
if (!phar_get_efp(entry, 0)) {
if (!phar_get_efp(entry, false)) {
/* re-open internal file pointer just-in-time */
newentry = phar_open_jit(phar, entry, error);
if (!newentry) {
Expand All @@ -2758,8 +2757,8 @@ void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_defa
}
entry = newentry;
}
file = phar_get_efp(entry, 0);
if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, 1)) {
file = phar_get_efp(entry, false);
if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, true)) {
if (must_close_old_file) {
php_stream_close(oldfile);
}
Expand All @@ -2778,7 +2777,7 @@ void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_defa
entry->compressed_filesize = entry->uncompressed_filesize;
continue;
}
filter = php_stream_filter_create(phar_compress_filter(entry, 0), NULL, 0);
filter = php_stream_filter_create(phar_compress_filter(entry, false), NULL, 0);
if (!filter) {
if (must_close_old_file) {
php_stream_close(oldfile);
Expand Down Expand Up @@ -2818,7 +2817,7 @@ void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_defa
ZEND_ASSERT(entry->header_offset == 0);
entry->header_offset = php_stream_tell(entry->cfp);
php_stream_flush(file);
if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, 0)) {
if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, false)) {
php_stream_filter_free(filter);
if (must_close_old_file) {
php_stream_close(oldfile);
Expand Down Expand Up @@ -3024,8 +3023,8 @@ void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_defa
file = entry->cfp;
php_stream_seek(file, entry->header_offset, SEEK_SET);
} else {
file = phar_get_efp(entry, 0);
if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, 0)) {
file = phar_get_efp(entry, false);
if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, false)) {
if (must_close_old_file) {
php_stream_close(oldfile);
}
Expand Down Expand Up @@ -3267,7 +3266,7 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type)
{
zend_op_array *res;
zend_string *name = NULL;
int failed;
bool failed;
phar_archive_data *phar;

if (!file_handle || !file_handle->filename) {
Expand Down Expand Up @@ -3318,11 +3317,11 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type)
}

zend_try {
failed = 0;
failed = false;
CG(zend_lineno) = 0;
res = phar_orig_compile_file(file_handle, type);
} zend_catch {
failed = 1;
failed = true;
res = NULL;
} zend_end_try();

Expand Down
76 changes: 38 additions & 38 deletions ext/phar/phar_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,8 @@ ZEND_BEGIN_MODULE_GLOBALS(phar)
/* for cached phars, this is a per-process store of fp/ufp */
phar_entry_fp *cached_fp;
HashTable phar_alias_map;
int phar_SERVER_mung_list;
char* cache_list;
int phar_SERVER_mung_list;
bool readonly;
bool manifest_cached;
bool persist;
Expand Down Expand Up @@ -150,8 +150,8 @@ ZEND_BEGIN_MODULE_GLOBALS(phar)
/* phar_get_archive cache */
char* last_phar_name;
uint32_t last_phar_name_len;
char* last_alias;
uint32_t last_alias_len;
char* last_alias;
phar_archive_data* last_phar;
HashTable mime_types;
ZEND_END_MODULE_GLOBALS(phar)
Expand Down Expand Up @@ -205,7 +205,6 @@ typedef struct _phar_entry_info {
uint32_t old_flags;
phar_metadata_tracker metadata_tracker;
zend_string *filename;
enum phar_fp_type fp_type;
/* offset within original phar file of the file contents */
zend_long offset_abs;
/* offset within fp of the file contents */
Expand All @@ -214,6 +213,7 @@ typedef struct _phar_entry_info {
zend_long header_offset;
php_stream *fp;
php_stream *cfp;
enum phar_fp_type fp_type;
int fp_refcount;
char *tmp;
phar_archive_data *phar;
Expand All @@ -224,32 +224,32 @@ typedef struct _phar_entry_info {
/* for stat */
unsigned short inode;

uint32_t is_crc_checked:1;
uint32_t is_modified:1;
uint32_t is_deleted:1;
uint32_t is_dir:1;
bool is_crc_checked:1;
bool is_modified:1;
bool is_deleted:1;
bool is_dir:1;
/* this flag is used for mounted entries (external files mapped to location
inside a phar */
uint32_t is_mounted:1;
bool is_mounted:1;
/* used when iterating */
uint32_t is_temp_dir:1;
bool is_temp_dir:1;
/* tar-based phar file stuff */
uint32_t is_tar:1;
bool is_tar:1;
/* zip-based phar file stuff */
uint32_t is_zip:1;
bool is_zip:1;
/* for cached phar entries */
uint32_t is_persistent:1;
bool is_persistent:1;
} phar_entry_info;

/* information about a phar file (the archive itself) */
struct _phar_archive_data {
char *fname;
uint32_t fname_len;
/* for phar_detect_fname_ext, this stores the location of the file extension within fname */
char *ext;
uint32_t ext_len;
char *ext;
char *alias;
uint32_t alias_len;
uint32_t alias_len;
char version[12];
size_t halt_offset;
HashTable manifest;
Expand All @@ -260,30 +260,30 @@ struct _phar_archive_data {
uint32_t flags;
uint32_t min_timestamp;
uint32_t max_timestamp;
int refcount;
php_stream *fp;
/* decompressed file contents are stored here */
php_stream *ufp;
int refcount;
uint32_t sig_flags;
uint32_t sig_len;
char *signature;
phar_metadata_tracker metadata_tracker;
uint32_t phar_pos;
/* if 1, then this alias was manually specified by the user and is not a permanent alias */
uint32_t is_temporary_alias:1;
uint32_t is_modified:1;
uint32_t is_writeable:1;
uint32_t is_brandnew:1;
bool is_temporary_alias:1;
bool is_modified:1;
bool is_writeable:1;
bool is_brandnew:1;
/* defer phar creation */
uint32_t donotflush:1;
bool donotflush:1;
/* zip-based phar variables */
uint32_t is_zip:1;
bool is_zip:1;
/* tar-based phar variables */
uint32_t is_tar:1;
bool is_tar:1;
/* PharData variables */
uint32_t is_data:1;
bool is_data:1;
/* for cached phar manifests */
uint32_t is_persistent:1;
bool is_persistent:1;
};

typedef struct _phar_entry_fp_info {
Expand Down Expand Up @@ -416,14 +416,14 @@ zend_result phar_create_signature(phar_archive_data *phar, php_stream *fp, char

/* utility functions */
zend_string *phar_create_default_stub(const char *index_php, const char *web_index, char **error);
char *phar_decompress_filter(phar_entry_info * entry, int return_unknown);
char *phar_compress_filter(phar_entry_info * entry, int return_unknown);
const char *phar_decompress_filter(const phar_entry_info *entry, bool return_unknown);
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);
zend_string *phar_find_in_include_path(zend_string *file, phar_archive_data **pphar);
char *phar_fix_filepath(char *path, size_t *new_len, int use_cwd);
char *phar_fix_filepath(char *path, size_t *new_len, bool use_cwd);
phar_entry_info * phar_open_jit(phar_archive_data *phar, phar_entry_info *entry, char **error);
void phar_parse_metadata_lazy(const char *buffer, phar_metadata_tracker *tracker, uint32_t zip_metadata_len, bool persistent);
bool phar_metadata_tracker_has_data(const phar_metadata_tracker* tracker, bool persistent);
Expand All @@ -434,23 +434,23 @@ void phar_metadata_tracker_clone(phar_metadata_tracker* tracker);
void phar_metadata_tracker_try_ensure_has_serialized_data(phar_metadata_tracker* tracker, bool persistent);
zend_result phar_metadata_tracker_unserialize_or_copy(phar_metadata_tracker* tracker, zval *value, bool persistent, HashTable *unserialize_options, const char* method_name);
void destroy_phar_manifest_entry(zval *zv);
int phar_seek_efp(phar_entry_info *entry, zend_off_t offset, int whence, zend_off_t position, int follow_links);
php_stream *phar_get_efp(phar_entry_info *entry, int follow_links);
int phar_seek_efp(phar_entry_info *entry, zend_off_t offset, int whence, zend_off_t position, bool follow_links);
php_stream *phar_get_efp(phar_entry_info *entry, bool follow_links);
zend_result phar_copy_entry_fp(phar_entry_info *source, phar_entry_info *dest, char **error);
zend_result phar_open_entry_fp(phar_entry_info *entry, char **error, int follow_links);
zend_result phar_open_entry_fp(phar_entry_info *entry, char **error, bool follow_links);
phar_entry_info *phar_get_link_source(phar_entry_info *entry);
zend_result phar_open_archive_fp(phar_archive_data *phar);
zend_result phar_copy_on_write(phar_archive_data **pphar);

/* tar functions in tar.c */
bool phar_is_tar(char *buf, 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_open_or_create_tar(char *fname, size_t fname_len, char *alias, size_t alias_len, int is_data, uint32_t options, phar_archive_data** pphar, char **error);
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);
void phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error);

/* zip functions in zip.c */
int phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, char **error);
int phar_open_or_create_zip(char *fname, size_t fname_len, char *alias, size_t alias_len, int is_data, uint32_t options, phar_archive_data** pphar, char **error);
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_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);
void phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);

#ifdef PHAR_MAIN
Expand All @@ -463,13 +463,13 @@ extern HashTable cached_alias;
bool phar_archive_delref(phar_archive_data *phar);
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, int security);
phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, size_t path_len, char dir, char **error, int security);
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, int security);
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, int security);
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);
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);
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);
void phar_flush_ex(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
void 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, int is_complete);
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);
zend_result phar_split_fname(const char *filename, size_t filename_len, char **arch, size_t *arch_len, char **entry, size_t *entry_len, int executable, int for_create);

typedef enum {
Expand Down
Loading