php8/php-build-reproducible-phar.patch

110 lines
3.7 KiB
Diff

From 485e2a4e43458a417603d4ed219af3e79854ef46 Mon Sep 17 00:00:00 2001
From: Arjen de Korte <build+github@de-korte.org>
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 <build+github@de-korte.org>
---
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.3.8/ext/phar/phar.c
===================================================================
--- php-8.3.8.orig/ext/phar/phar.c
+++ php-8.3.8/ext/phar/phar.c
@@ -2996,7 +2996,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.3.8/ext/phar/phar_internal.h
===================================================================
--- php-8.3.8.orig/ext/phar/phar_internal.h
+++ php-8.3.8/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.3.8/ext/phar/stream.c
===================================================================
--- php-8.3.8.orig/ext/phar/stream.c
+++ php-8.3.8/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.3.8/ext/phar/tar.c
===================================================================
--- php-8.3.8.orig/ext/phar/tar.c
+++ php-8.3.8/ext/phar/tar.c
@@ -965,7 +965,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.3.8/ext/phar/util.c
===================================================================
--- php-8.3.8.orig/ext/phar/util.c
+++ php-8.3.8/ext/phar/util.c
@@ -584,7 +584,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.3.8/ext/phar/zip.c
===================================================================
--- php-8.3.8.orig/ext/phar/zip.c
+++ php-8.3.8/ext/phar/zip.c
@@ -1236,7 +1236,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;