diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 51b28ec2b74..23624ce6bcc 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -2459,8 +2459,8 @@ 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); } /** @@ -2468,7 +2468,7 @@ ZEND_ATTRIBUTE_NONNULL void phar_flush(phar_archive_data *phar, char **error) { * * 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();"; @@ -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) { @@ -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) { @@ -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); @@ -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 { @@ -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); @@ -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); @@ -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 */ @@ -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); @@ -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) { @@ -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); @@ -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) { @@ -3116,6 +3115,8 @@ cleanup: entry->header_offset = 0; } } ZEND_HASH_FOREACH_END(); + + return EOF; } /* }}} */ diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 5acb0873ebd..46e45ec61b7 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -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; @@ -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); diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 77ca7137fdf..71bacf667bb 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -467,16 +467,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; } diff --git a/ext/phar/tar.c b/ext/phar/tar.c index 67994289d0a..01ab3f2dd47 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -960,7 +960,7 @@ ZEND_ATTRIBUTE_NONNULL static int phar_tar_setupmetadata(zval *zv, void *argumen } /* }}} */ -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) /* {{{ */ { static const char newstub[] = "is_persistent) { spprintf(error, 0, "internal error: attempt to flush cached tar-based phar \"%s\"", phar->fname); - return; + return EOF; } if (phar->is_data) { @@ -997,12 +997,12 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_tar_flush(phar_archive_data *phar, z entry.fp = php_stream_fopen_tmpfile(); if (entry.fp == NULL) { *error = estrdup("phar error: unable to create temporary file"); - return; + return EOF; } if (phar->alias_len != php_stream_write(entry.fp, phar->alias, phar->alias_len)) { spprintf(error, 0, "unable to set alias in tar-based phar \"%s\"", phar->fname); php_stream_close(entry.fp); - return; + return EOF; } entry.uncompressed_filesize = phar->alias_len; @@ -1021,7 +1021,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_tar_flush(phar_archive_data *phar, z if (pos == NULL) { spprintf(error, 0, "illegal stub for tar-based phar \"%s\"", phar->fname); - return; + return EOF; } size_t len = pos - ZSTR_VAL(user_stub) + strlen(halt_stub); @@ -1031,7 +1031,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_tar_flush(phar_archive_data *phar, z entry.fp = php_stream_fopen_tmpfile(); if (entry.fp == NULL) { *error = estrdup("phar error: unable to create temporary file"); - return; + return EOF; } entry.uncompressed_filesize = len + end_sequence_len; @@ -1041,7 +1041,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_tar_flush(phar_archive_data *phar, z ) { spprintf(error, 0, "unable to create stub from string in new tar-based phar \"%s\"", phar->fname); php_stream_close(entry.fp); - return; + return EOF; } entry.filename = ZSTR_INIT_LITERAL(".phar/stub.php", false); @@ -1051,13 +1051,13 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_tar_flush(phar_archive_data *phar, z entry.fp = php_stream_fopen_tmpfile(); if (entry.fp == NULL) { *error = estrdup("phar error: unable to create temporary file"); - return; + return EOF; } if (sizeof(newstub)-1 != php_stream_write(entry.fp, newstub, sizeof(newstub)-1)) { php_stream_close(entry.fp); spprintf(error, 0, "unable to %s stub in%star-based phar \"%s\", failed", user_stub ? "overwrite" : "create", user_stub ? " " : " new ", phar->fname); - return; + return EOF; } entry.uncompressed_filesize = entry.compressed_filesize = sizeof(newstub) - 1; @@ -1069,7 +1069,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_tar_flush(phar_archive_data *phar, z php_stream_close(entry.fp); zend_string_efree(entry.filename); spprintf(error, 0, "unable to create stub in tar-based phar \"%s\"", phar->fname); - return; + return EOF; } } else { php_stream_close(entry.fp); @@ -1095,7 +1095,7 @@ nostub: if (must_close_old_file) { php_stream_close(oldfile); } - return; + return EOF; } pass.old = oldfile; @@ -1111,7 +1111,7 @@ nostub: if (must_close_old_file) { php_stream_close(oldfile); } - return; + return EOF; } } else { phar_entry_info newentry = {0}; @@ -1127,7 +1127,7 @@ nostub: if (must_close_old_file) { php_stream_close(oldfile); } - return; + return EOF; } if (ZEND_HASH_APPLY_KEEP != phar_tar_setmetadata(&phar->metadata_tracker, mentry, error)) { @@ -1135,7 +1135,7 @@ nostub: if (must_close_old_file) { php_stream_close(oldfile); } - return; + return EOF; } } } @@ -1149,7 +1149,7 @@ nostub: /* on error in the hash iterator above, error is set */ php_stream_close(newfile); - return; + return EOF; } zend_hash_apply_with_argument(&phar->manifest, phar_tar_writeheaders, (void *) &pass); @@ -1161,7 +1161,7 @@ nostub: /* on error in the hash iterator above, error is set */ php_stream_close(newfile); - return; + return EOF; } /* add signature for executable tars or tars explicitly set with setSignatureAlgorithm */ @@ -1176,7 +1176,7 @@ nostub: } php_stream_close(newfile); - return; + return EOF; } entry.fp = php_stream_fopen_tmpfile(); @@ -1188,7 +1188,7 @@ nostub: php_stream_close(oldfile); } php_stream_close(newfile); - return; + return EOF; } #ifdef WORDS_BIGENDIAN # define PHAR_SET_32(destination, source) do { \ @@ -1212,7 +1212,7 @@ nostub: php_stream_close(oldfile); } php_stream_close(newfile); - return; + return EOF; } ALLOCA_FLAG(use_heap); @@ -1229,7 +1229,7 @@ nostub: } /* error is set by writeheaders */ php_stream_close(newfile); - return; + return EOF; } } /* signature */ @@ -1264,7 +1264,7 @@ nostub: if (!phar->fp) { phar->fp = newfile; spprintf(error, 0, "unable to open new phar \"%s\" for writing", phar->fname); - return; + return EOF; } if (phar->flags & PHAR_FILE_COMPRESSED_GZ) { @@ -1286,7 +1286,7 @@ nostub: php_stream_copy_to_stream_ex(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); php_stream_close(newfile); 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); @@ -1313,5 +1313,6 @@ nostub: php_stream_close(newfile); } } + return 0; } /* }}} */ diff --git a/ext/phar/tests/fflush_phar_file_report_success.phpt b/ext/phar/tests/fflush_phar_file_report_success.phpt new file mode 100644 index 00000000000..615f4e58e56 --- /dev/null +++ b/ext/phar/tests/fflush_phar_file_report_success.phpt @@ -0,0 +1,25 @@ +--TEST-- +fflush() on phar file should report success +--EXTENSIONS-- +phar +--INI-- +phar.readonly=0 +--FILE-- +addFromString('test', 'contents'); +unset($phar); + +$f = fopen('phar://' . __DIR__.'/fflush_phar_file_report_success.phar/test', 'w'); +var_dump(fflush($f)); +var_dump(fclose($f)); + +?> +--CLEAN-- + +--EXPECT-- +bool(true) +bool(true) diff --git a/ext/phar/zip.c b/ext/phar/zip.c index e38708e1337..660cd0a9878 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -1224,7 +1224,7 @@ static zend_result phar_zip_applysignature(phar_archive_data *phar, struct _phar } /* }}} */ -ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_zip_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error) /* {{{ */ +ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error) /* {{{ */ { static const char newstub[] = "is_persistent) { spprintf(error, 0, "internal error: attempt to flush cached zip-based phar \"%s\"", phar->fname); - return; + return EOF; } if (phar->is_data) { @@ -1256,12 +1256,12 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_zip_flush(phar_archive_data *phar, z entry.fp = php_stream_fopen_tmpfile(); if (entry.fp == NULL) { *error = estrdup("phar error: unable to create temporary file"); - return; + return EOF; } if (phar->alias_len != php_stream_write(entry.fp, phar->alias, phar->alias_len)) { php_stream_close(entry.fp); spprintf(error, 0, "unable to set alias in zip-based phar \"%s\"", phar->fname); - return; + return EOF; } entry.uncompressed_filesize = entry.compressed_filesize = phar->alias_len; @@ -1275,7 +1275,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_zip_flush(phar_archive_data *phar, z /* register alias */ if (phar->alias_len) { if (FAILURE == phar_get_archive(&phar, phar->fname, phar->fname_len, phar->alias, phar->alias_len, error)) { - return; + return EOF; } } @@ -1285,7 +1285,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_zip_flush(phar_archive_data *phar, z if (pos == NULL) { spprintf(error, 0, "illegal stub for zip-based phar \"%s\"", phar->fname); - return; + return EOF; } size_t len = pos - ZSTR_VAL(user_stub) + strlen(halt_stub); @@ -1295,7 +1295,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_zip_flush(phar_archive_data *phar, z entry.fp = php_stream_fopen_tmpfile(); if (entry.fp == NULL) { *error = estrdup("phar error: unable to create temporary file"); - return; + return EOF; } entry.uncompressed_filesize = len + end_sequence_len; @@ -1305,7 +1305,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_zip_flush(phar_archive_data *phar, z ) { spprintf(error, 0, "unable to create stub from string in new zip-based phar \"%s\"", phar->fname); php_stream_close(entry.fp); - return; + return EOF; } entry.filename = ZSTR_INIT_LITERAL(".phar/stub.php", false); @@ -1316,12 +1316,12 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_zip_flush(phar_archive_data *phar, z entry.fp = php_stream_fopen_tmpfile(); if (entry.fp == NULL) { *error = estrdup("phar error: unable to create temporary file"); - return; + return EOF; } if (sizeof(newstub)-1 != php_stream_write(entry.fp, newstub, sizeof(newstub)-1)) { php_stream_close(entry.fp); spprintf(error, 0, "unable to %s stub in%szip-based phar \"%s\", failed", user_stub ? "overwrite" : "create", user_stub ? " " : " new ", phar->fname); - return; + return EOF; } entry.uncompressed_filesize = entry.compressed_filesize = sizeof(newstub) - 1; @@ -1333,7 +1333,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_zip_flush(phar_archive_data *phar, z php_stream_close(entry.fp); zend_string_efree(entry.filename); spprintf(error, 0, "unable to create stub in zip-based phar \"%s\"", phar->fname); - return; + return EOF; } } else { php_stream_close(entry.fp); @@ -1366,7 +1366,7 @@ fperror: php_stream_close(oldfile); } spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to open temporary file", phar->fname); - return; + return EOF; } pass.centralfp = php_stream_fopen_tmpfile(); @@ -1404,7 +1404,7 @@ nocentralerror: if (must_close_old_file) { php_stream_close(oldfile); } - return; + return EOF; } /* save zip */ @@ -1471,7 +1471,7 @@ nocentralerror: } phar->fp = pass.filefp; spprintf(error, 4096, "unable to open new phar \"%s\" for writing", phar->fname); - return; + return EOF; } php_stream_rewind(pass.filefp); php_stream_copy_to_stream_ex(pass.filefp, phar->fp, PHP_STREAM_COPY_ALL, NULL); @@ -1482,5 +1482,6 @@ nocentralerror: if (must_close_old_file) { php_stream_close(oldfile); } + return 0; } /* }}} */