From 485e2a4e43458a417603d4ed219af3e79854ef46 Mon Sep 17 00:00:00 2001 From: Arjen de Korte Date: Sat, 2 Jan 2021 17:57:18 +0100 Subject: [PATCH 1/1] phar: honor SOURCE_DATE_EPOCH for timestamps In order to build reproducible phars, honor SOURCE_DATE_EPOCH if set Signed-off-by: Arjen de Korte --- ext/phar/phar.c | 2 +- ext/phar/phar_internal.h | 15 +++++++++++++++ ext/phar/stream.c | 2 +- ext/phar/tar.c | 2 +- ext/phar/util.c | 2 +- ext/phar/zip.c | 2 +- 6 files changed, 18 insertions(+), 5 deletions(-) Index: php-8.2.16/ext/phar/phar.c =================================================================== --- php-8.2.16.orig/ext/phar/phar.c +++ php-8.2.16/ext/phar/phar.c @@ -2999,7 +2999,7 @@ int phar_flush(phar_archive_data *phar, 4: metadata-len +: metadata */ - mytime = time(NULL); + mytime = source_date_epoch_time(NULL); phar_set_32(entry_buffer, entry->uncompressed_filesize); phar_set_32(entry_buffer+4, mytime); phar_set_32(entry_buffer+8, entry->compressed_filesize); Index: php-8.2.16/ext/phar/phar_internal.h =================================================================== --- php-8.2.16.orig/ext/phar/phar_internal.h +++ php-8.2.16/ext/phar/phar_internal.h @@ -427,6 +427,21 @@ static inline enum phar_fp_type phar_get return PHAR_G(cached_fp)[entry->phar->phar_pos].manifest[entry->manifest_pos].fp_type; } +static inline time_t source_date_epoch_time(time_t *tloc) +{ + const char *sde; + time_t ts; + + tsrm_env_lock(); + sde = getenv("SOURCE_DATE_EPOCH"); + ts = (sde) ? strtoul(sde, NULL, 10) : time(0); + tsrm_env_unlock(); + if (tloc) { + *tloc = ts; + } + return ts; +} + static inline zend_off_t phar_get_fp_offset(phar_entry_info *entry) { if (!entry->is_persistent) { Index: php-8.2.16/ext/phar/stream.c =================================================================== --- php-8.2.16.orig/ext/phar/stream.c +++ php-8.2.16/ext/phar/stream.c @@ -474,7 +474,7 @@ static int phar_stream_flush(php_stream phar_entry_data *data = (phar_entry_data *) stream->abstract; if (data->internal_file->is_modified) { - data->internal_file->timestamp = time(0); + data->internal_file->timestamp = source_date_epoch_time(0); ret = phar_flush(data->phar, 0, 0, 0, &error); if (error) { php_stream_wrapper_log_error(stream->wrapper, REPORT_ERRORS, "%s", error); Index: php-8.2.16/ext/phar/tar.c =================================================================== --- php-8.2.16.orig/ext/phar/tar.c +++ php-8.2.16/ext/phar/tar.c @@ -972,7 +972,7 @@ int phar_tar_flush(phar_archive_data *ph char halt_stub[] = "__HALT_COMPILER();"; entry.flags = PHAR_ENT_PERM_DEF_FILE; - entry.timestamp = time(NULL); + entry.timestamp = source_date_epoch_time(NULL); entry.is_modified = 1; entry.is_crc_checked = 1; entry.is_tar = 1; Index: php-8.2.16/ext/phar/util.c =================================================================== --- php-8.2.16.orig/ext/phar/util.c +++ php-8.2.16/ext/phar/util.c @@ -574,7 +574,7 @@ phar_entry_data *phar_get_or_create_entr phar_add_virtual_dirs(phar, path, path_len); etemp.is_modified = 1; - etemp.timestamp = time(0); + etemp.timestamp = source_date_epoch_time(0); etemp.is_crc_checked = 1; etemp.phar = phar; etemp.filename = estrndup(path, path_len); Index: php-8.2.16/ext/phar/zip.c =================================================================== --- php-8.2.16.orig/ext/phar/zip.c +++ php-8.2.16/ext/phar/zip.c @@ -1237,7 +1237,7 @@ int phar_zip_flush(phar_archive_data *ph pass.error = &temperr; entry.flags = PHAR_ENT_PERM_DEF_FILE; - entry.timestamp = time(NULL); + entry.timestamp = source_date_epoch_time(NULL); entry.is_modified = 1; entry.is_zip = 1; entry.phar = phar;