Skip to content

Commit 23a937f

Browse files
committed
ext/phar: inject time effect
The objective of this is to potentially allow userland to set the timestamp to allow building reproducible phars
1 parent ca914ee commit 23a937f

File tree

8 files changed

+98
-62
lines changed

8 files changed

+98
-62
lines changed

ext/phar/dirstream.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,8 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo
452452
return 0;
453453
}
454454

455-
phar_flush(phar, &error);
455+
time_t now = time(NULL);
456+
phar_flush(phar, now, &error);
456457

457458
if (error) {
458459
php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\" in phar \"%s\", %s", ZSTR_VAL(entry.filename), phar->fname, error);
@@ -573,7 +574,9 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
573574
} else {
574575
entry->is_deleted = 1;
575576
entry->is_modified = 1;
576-
phar_flush(phar, &error);
577+
// TODO: get timestamp from context?
578+
time_t now = time(NULL);
579+
phar_flush(phar, now, &error);
577580

578581
if (error) {
579582
php_stream_wrapper_log_error(wrapper, options, "phar error: cannot remove directory \"%s\" in phar \"%s\", %s", ZSTR_VAL(entry->filename), phar->fname, error);

ext/phar/phar.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,9 @@ ZEND_ATTRIBUTE_NONNULL void phar_entry_remove(phar_entry_data *idata, char **err
433433
}
434434

435435
if (!phar->donotflush) {
436-
phar_flush(phar, error);
436+
// TODO: inject
437+
time_t now = time(NULL);
438+
phar_flush(phar, now, error);
437439
}
438440
}
439441
/* }}} */
@@ -1715,7 +1717,8 @@ static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_l
17151717

17161718
if (!memcmp(pos, zip_magic, 4)) {
17171719
php_stream_seek(fp, 0, SEEK_END);
1718-
return phar_parse_zipfile(fp, fname, fname_len, alias, alias_len, pphar, error);
1720+
time_t now = time(NULL);
1721+
return phar_parse_zipfile(fp, fname, fname_len, alias, alias_len, pphar, now, error);
17191722
}
17201723

17211724
if (got >= 512) {
@@ -2459,16 +2462,16 @@ zend_string *phar_create_default_stub(const zend_string *php_index_str, const ze
24592462
}
24602463
/* }}} */
24612464

2462-
ZEND_ATTRIBUTE_NONNULL int phar_flush(phar_archive_data *phar, char **error) {
2463-
return phar_flush_ex(phar, NULL, false, error);
2465+
ZEND_ATTRIBUTE_NONNULL int phar_flush(phar_archive_data *phar, time_t timestamp, char **error) {
2466+
return phar_flush_ex(phar, NULL, false, timestamp, error);
24642467
}
24652468

24662469
/**
24672470
* Save phar contents to disk
24682471
*
24692472
* if user_stub is NULL the default or existing stub should be used
24702473
*/
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) /* {{{ */
2474+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5) int phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, time_t timestamp, char **error) /* {{{ */
24722475
{
24732476
static const char halt_stub[] = "__HALT_COMPILER();";
24742477

@@ -2482,7 +2485,7 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
24822485
zend_off_t manifest_ftell;
24832486
zend_long offset;
24842487
size_t wrote;
2485-
uint32_t manifest_len, mytime, new_manifest_count;
2488+
uint32_t manifest_len, new_manifest_count;
24862489
uint32_t newcrc32;
24872490
php_stream *file, *oldfile, *newfile;
24882491
php_stream_filter *filter;
@@ -2507,11 +2510,11 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
25072510
zend_hash_clean(&phar->virtual_dirs);
25082511

25092512
if (phar->is_zip) {
2510-
return phar_zip_flush(phar, user_stub, is_default_stub, error);
2513+
return phar_zip_flush(phar, user_stub, is_default_stub, timestamp, error);
25112514
}
25122515

25132516
if (phar->is_tar) {
2514-
return phar_tar_flush(phar, user_stub, is_default_stub, error);
2517+
return phar_tar_flush(phar, user_stub, is_default_stub, timestamp, error);
25152518
}
25162519

25172520
if (PHAR_G(readonly)) {
@@ -2871,9 +2874,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 4) int phar_flush_ex(phar_archive_data *phar, zen
28712874
4: metadata-len
28722875
+: metadata
28732876
*/
2874-
mytime = time(NULL);
28752877
phar_set_32(entry_buffer, entry->uncompressed_filesize);
2876-
phar_set_32(entry_buffer+4, mytime);
2878+
phar_set_32(entry_buffer+4, timestamp);
28772879
phar_set_32(entry_buffer+8, entry->compressed_filesize);
28782880
phar_set_32(entry_buffer+12, entry->crc32);
28792881
phar_set_32(entry_buffer+16, entry->flags);

ext/phar/phar_internal.h

Lines changed: 6 additions & 6 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) int phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error);
449+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5) int phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, time_t timestamp, char **error);
450450

451451
/* zip functions in zip.c */
452-
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);
452+
zend_result phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, time_t timestamp, 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) int phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
454+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5) int phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, time_t timestamp, char **error);
455455

456456
#ifdef PHAR_MAIN
457457
extern const php_stream_wrapper php_stream_phar_wrapper;
@@ -465,10 +465,10 @@ void phar_entry_delref(phar_entry_data *idata);
465465

466466
phar_entry_info *phar_get_entry_info(phar_archive_data *phar, char *path, size_t path_len, char **error, bool security);
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);
468-
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);
468+
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, time_t timestamp, 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) 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);
470+
ZEND_ATTRIBUTE_NONNULL_ARGS(1, 5) int phar_flush_ex(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, time_t timestamp, char **error);
471+
ZEND_ATTRIBUTE_NONNULL int phar_flush(phar_archive_data *archive, time_t timestamp, 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

0 commit comments

Comments
 (0)