Skip to content

Commit 40ff6e0

Browse files
committed
Merge branch 'PHP-8.5'
* PHP-8.5: Revert "ext/phar: Voidify flush function as it always returns EOL" phar: Fix broken return value of fflush() for phar file entries
2 parents 363dd91 + 7809d51 commit 40ff6e0

File tree

6 files changed

+91
-62
lines changed

6 files changed

+91
-62
lines changed

ext/phar/phar.c

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2459,16 +2459,16 @@ zend_string *phar_create_default_stub(const zend_string *php_index_str, const ze
24592459
}
24602460
/* }}} */
24612461

2462-
ZEND_ATTRIBUTE_NONNULL void phar_flush(phar_archive_data *phar, char **error) {
2463-
phar_flush_ex(phar, NULL, false, error);
2462+
ZEND_ATTRIBUTE_NONNULL int phar_flush(phar_archive_data *phar, char **error) {
2463+
return phar_flush_ex(phar, NULL, false, error);
24642464
}
24652465

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

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

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

25012501
*error = NULL;
25022502

25032503
if (!zend_hash_num_elements(&phar->manifest) && !user_stub) {
2504-
return;
2504+
return EOF;
25052505
}
25062506

25072507
zend_hash_clean(&phar->virtual_dirs);
25082508

25092509
if (phar->is_zip) {
2510-
phar_zip_flush(phar, user_stub, is_default_stub, error);
2511-
return;
2510+
return phar_zip_flush(phar, user_stub, is_default_stub, error);
25122511
}
25132512

25142513
if (phar->is_tar) {
2515-
phar_tar_flush(phar, user_stub, is_default_stub, error);
2516-
return;
2514+
return phar_tar_flush(phar, user_stub, is_default_stub, error);
25172515
}
25182516

25192517
if (PHAR_G(readonly)) {
2520-
return;
2518+
return EOF;
25212519
}
25222520

25232521
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
25342532
if (must_close_old_file) {
25352533
php_stream_close(oldfile);
25362534
}
2537-
return;
2535+
return EOF;
25382536
}
25392537

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

25522550
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
25622560
}
25632561
php_stream_close(newfile);
25642562
spprintf(error, 0, "unable to create stub from string in new phar \"%s\"", phar->fname);
2565-
return;
2563+
return EOF;
25662564
}
25672565
phar->halt_offset = len + end_sequence_len;
25682566
} else {
@@ -2590,7 +2588,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
25902588
if (new_stub) {
25912589
zend_string_free(new_stub);
25922590
}
2593-
return;
2591+
return EOF;
25942592
}
25952593
if (new_stub) {
25962594
zend_string_free(new_stub);
@@ -2684,7 +2682,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
26842682
}
26852683
php_stream_close(newfile);
26862684
spprintf(error, 0, "unable to seek to start of file \"%s\" while creating new phar \"%s\"", ZSTR_VAL(entry->filename), phar->fname);
2687-
return;
2685+
return EOF;
26882686
}
26892687
newcrc32 = php_crc32_bulk_init();
26902688
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
27052703
entry->flags & PHAR_ENT_COMPRESSED_GZ ? "gzip" : "bzip2",
27062704
ZSTR_VAL(entry->filename),
27072705
phar->fname);
2708-
return;
2706+
return EOF;
27092707
}
27102708

27112709
/* 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
30103008
php_stream_close(oldfile);
30113009
}
30123010
php_stream_close(newfile);
3013-
return;
3011+
return EOF;
30143012
}
30153013

30163014
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
30603058
if (!phar->fp) {
30613059
phar->fp = newfile;
30623060
spprintf(error, 4096, "unable to open new phar \"%s\" for writing", phar->fname);
3063-
return;
3061+
return EOF;
30643062
}
30653063

30663064
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
30743072

30753073
if (!filter) {
30763074
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);
3077-
return;
3075+
return EOF;
30783076
}
30793077

30803078
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
31023100

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

3107-
return;
3106+
return 0;
31083107

31093108
cleanup:
31103109
if (shared_cfp != NULL) {
@@ -3116,6 +3115,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *phar, ze
31163115
entry->header_offset = 0;
31173116
}
31183117
} ZEND_HASH_FOREACH_END();
3118+
3119+
return EOF;
31193120
}
31203121
/* }}} */
31213122

ext/phar/phar_internal.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -446,12 +446,12 @@ zend_result phar_copy_on_write(phar_archive_data **pphar);
446446
bool phar_is_tar(const char *buf, const char *fname);
447447
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);
448448
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);
449-
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error);
449+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error);
450450

451451
/* zip functions in zip.c */
452452
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);
453453
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);
454-
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
454+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
455455

456456
#ifdef PHAR_MAIN
457457
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
467467
phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, size_t path_len, char dir, char **error, bool security);
468468
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);
469469
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);
470-
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) void phar_flush_ex(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
471-
ZEND_ATTRIBUTE_NONNULL void phar_flush(phar_archive_data *archive, char **error);
470+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
471+
ZEND_ATTRIBUTE_NONNULL int phar_flush(phar_archive_data *archive, char **error);
472472
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);
473473
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);
474474

ext/phar/stream.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -467,16 +467,17 @@ static ssize_t phar_stream_write(php_stream *stream, const char *buf, size_t cou
467467
static int phar_stream_flush(php_stream *stream) /* {{{ */
468468
{
469469
char *error;
470+
int ret;
470471
phar_entry_data *data = (phar_entry_data *) stream->abstract;
471472

472473
if (data->internal_file->is_modified) {
473474
data->internal_file->timestamp = time(0);
474-
phar_flush(data->phar, &error);
475+
ret = phar_flush(data->phar, &error);
475476
if (error) {
476477
php_stream_wrapper_log_error(stream->wrapper, REPORT_ERRORS, "%s", error);
477478
efree(error);
478479
}
479-
return EOF;
480+
return ret;
480481
} else {
481482
return EOF;
482483
}

0 commit comments

Comments
 (0)