Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 21 additions & 20 deletions ext/phar/phar.c
Original file line number Diff line number Diff line change
Expand Up @@ -2459,16 +2459,16 @@ zend_string *phar_create_default_stub(const zend_string *php_index_str, const ze
}
/* }}} */

ZEND_ATTRIBUTE_NONNULL void phar_flush(phar_archive_data *phar, char **error) {
phar_flush_ex(phar, NULL, false, error);
ZEND_ATTRIBUTE_NONNULL int phar_flush(phar_archive_data *phar, char **error) {
return phar_flush_ex(phar, NULL, false, error);
}

/**
* Save phar contents to disk
*
* if user_stub is NULL the default or existing stub should be used
*/
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error) /* {{{ */
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error) /* {{{ */
{
static const char halt_stub[] = "__HALT_COMPILER();";

Expand All @@ -2495,29 +2495,27 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze

if (phar->is_persistent) {
spprintf(error, 0, "internal error: attempt to flush cached zip-based phar \"%s\"", phar->fname);
return;
return EOF;
}

*error = NULL;

if (!zend_hash_num_elements(&phar->manifest) && !user_stub) {
return;
return EOF;
}

zend_hash_clean(&phar->virtual_dirs);

if (phar->is_zip) {
phar_zip_flush(phar, user_stub, is_default_stub, error);
return;
return phar_zip_flush(phar, user_stub, is_default_stub, error);
}

if (phar->is_tar) {
phar_tar_flush(phar, user_stub, is_default_stub, error);
return;
return phar_tar_flush(phar, user_stub, is_default_stub, error);
}

if (PHAR_G(readonly)) {
return;
return EOF;
}

if (phar->fp && !phar->is_brandnew) {
Expand All @@ -2534,7 +2532,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
if (must_close_old_file) {
php_stream_close(oldfile);
}
return;
return EOF;
}

if (user_stub) {
Expand All @@ -2546,7 +2544,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
}
php_stream_close(newfile);
spprintf(error, 0, "illegal stub for phar \"%s\" (__HALT_COMPILER(); is missing)", phar->fname);
return;
return EOF;
}

size_t len = pos - ZSTR_VAL(user_stub) + strlen(halt_stub);
Expand All @@ -2562,7 +2560,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
}
php_stream_close(newfile);
spprintf(error, 0, "unable to create stub from string in new phar \"%s\"", phar->fname);
return;
return EOF;
}
phar->halt_offset = len + end_sequence_len;
} else {
Expand Down Expand Up @@ -2590,7 +2588,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
if (new_stub) {
zend_string_free(new_stub);
}
return;
return EOF;
}
if (new_stub) {
zend_string_free(new_stub);
Expand Down Expand Up @@ -2684,7 +2682,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
}
php_stream_close(newfile);
spprintf(error, 0, "unable to seek to start of file \"%s\" while creating new phar \"%s\"", ZSTR_VAL(entry->filename), phar->fname);
return;
return EOF;
}
newcrc32 = php_crc32_bulk_init();
php_crc32_stream_bulk_update(&newcrc32, file, entry->uncompressed_filesize);
Expand All @@ -2705,7 +2703,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
entry->flags & PHAR_ENT_COMPRESSED_GZ ? "gzip" : "bzip2",
ZSTR_VAL(entry->filename),
phar->fname);
return;
return EOF;
}

/* create new file that holds the compressed versions */
Expand Down Expand Up @@ -3010,7 +3008,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
php_stream_close(oldfile);
}
php_stream_close(newfile);
return;
return EOF;
}

php_stream_write(newfile, digest, digest_len);
Expand Down Expand Up @@ -3060,7 +3058,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
if (!phar->fp) {
phar->fp = newfile;
spprintf(error, 4096, "unable to open new phar \"%s\" for writing", phar->fname);
return;
return EOF;
}

if (phar->flags & PHAR_FILE_COMPRESSED_GZ) {
Expand All @@ -3074,7 +3072,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze

if (!filter) {
spprintf(error, 4096, "unable to compress all contents of phar \"%s\" using zlib, PHP versions older than 5.2.6 have a buggy zlib", phar->fname);
return;
return EOF;
}

php_stream_filter_append(&phar->fp->writefilters, filter);
Expand Down Expand Up @@ -3102,9 +3100,10 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze

if (-1 == php_stream_seek(phar->fp, phar->halt_offset, SEEK_SET)) {
spprintf(error, 0, "unable to seek to __HALT_COMPILER(); in new phar \"%s\"", phar->fname);
return EOF;
}

return;
return 0;

cleanup:
if (shared_cfp != NULL) {
Expand All @@ -3116,6 +3115,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
entry->header_offset = 0;
}
} ZEND_HASH_FOREACH_END();

return EOF;
}
/* }}} */

Expand Down
8 changes: 4 additions & 4 deletions ext/phar/phar_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -446,12 +446,12 @@ zend_result phar_copy_on_write(phar_archive_data **pphar);
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_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) void phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, 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_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) void phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, 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);

#ifdef PHAR_MAIN
extern const php_stream_wrapper php_stream_phar_wrapper;
Expand All @@ -467,8 +467,8 @@ phar_entry_info *phar_get_entry_info(phar_archive_data *phar, char *path, size_t
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);
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_ARGS(1, 4) void phar_flush_ex(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
ZEND_ATTRIBUTE_NONNULL void phar_flush(phar_archive_data *archive, char **error);
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);
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);

Expand Down
7 changes: 3 additions & 4 deletions ext/phar/stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -424,11 +424,9 @@ static int phar_stream_seek(php_stream *stream, zend_off_t offset, int whence, z

zend_off_t temp_signed = (zend_off_t) temp;
if (temp_signed > data->zero + (zend_off_t) entry->uncompressed_filesize) {
*newoffset = -1; /* FIXME: this will invalidate the ZEND_ASSERT(stream->position >= 0); assertion in streams.c */
return -1;
}
if (temp_signed < data->zero) {
*newoffset = -1; /* FIXME: this will invalidate the ZEND_ASSERT(stream->position >= 0); assertion in streams.c */
return -1;
}
res = php_stream_seek(data->fp, temp_signed, SEEK_SET);
Expand Down Expand Up @@ -467,16 +465,17 @@ static ssize_t phar_stream_write(php_stream *stream, const char *buf, size_t cou
static int phar_stream_flush(php_stream *stream) /* {{{ */
{
char *error;
int ret;
phar_entry_data *data = (phar_entry_data *) stream->abstract;

if (data->internal_file->is_modified) {
data->internal_file->timestamp = time(0);
phar_flush(data->phar, &error);
ret = phar_flush(data->phar, &error);
if (error) {
php_stream_wrapper_log_error(stream->wrapper, REPORT_ERRORS, "%s", error);
efree(error);
}
return EOF;
return ret;
} else {
return EOF;
}
Expand Down
Loading