From 4e3daedbc7873bb3a97f0f24ce2d199536ae5a64 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Sat, 7 Oct 2017 12:52:17 +0200 Subject: [PATCH] Make build of nscd reproducible --- glibc-nscd-reproducible.patch | 70 +++++++++++++++++++++++++++++++++++ glibc.spec | 2 + 2 files changed, 72 insertions(+) create mode 100644 glibc-nscd-reproducible.patch diff --git a/glibc-nscd-reproducible.patch b/glibc-nscd-reproducible.patch new file mode 100644 index 0000000..05ba7f2 --- /dev/null +++ b/glibc-nscd-reproducible.patch @@ -0,0 +1,70 @@ +commit 1e9522c61c7a544d59db32cb7fbbd42e6793d848 +Author: Florian Weimer +Date: Thu Oct 5 18:14:27 2017 +0200 + + nscd: Eliminate compilation time dependency in the build output + + Reviewed-by: Carlos O'Donell + +diff --git a/nscd/nscd_stat.c b/nscd/nscd_stat.c +index feb1c98ac31edcb8..b1bc81bd6d7d7fd1 100644 +--- a/nscd/nscd_stat.c ++++ b/nscd/nscd_stat.c +@@ -35,9 +35,23 @@ + # include + #endif /* HAVE_SELINUX */ + ++/* We use this to make sure the receiver is the same. The lower 16 ++ bits are reserved for flags indicating compilation variants. This ++ version needs to be updated if the definition of struct statdata ++ changes. */ ++#define STATDATA_VERSION 0x01020000U + +-/* We use this to make sure the receiver is the same. */ +-static const char compilation[21] = __DATE__ " " __TIME__; ++#ifdef HAVE_SELINUX ++# define STATDATA_VERSION_SELINUX_FLAG 0x0001U ++#else ++# define STATDATA_VERSION_SELINUX_FLAG 0x0000U ++#endif ++ ++/* All flags affecting the struct statdata layout. */ ++#define STATDATA_VERSION_FLAGS STATDATA_VERSION_SELINUX_FLAG ++ ++/* The full version number for struct statdata. */ ++#define STATDATA_VERSION_FULL (STATDATA_VERSION | STATDATA_VERSION_FLAGS) + + /* Statistic data for one database. */ + struct dbstat +@@ -68,10 +82,11 @@ struct dbstat + uintmax_t addfailed; + }; + +-/* Record for transmitting statistics. */ ++/* Record for transmitting statistics. If this definition changes, ++ update STATDATA_VERSION above. */ + struct statdata + { +- char version[sizeof (compilation)]; ++ unsigned int version; /* Must be STATDATA_VERSION_FULL. */ + int debug_level; + time_t runtime; + unsigned long int client_queued; +@@ -96,7 +111,7 @@ send_stats (int fd, struct database_dyn dbs[lastdb]) + + memset (&data, 0, sizeof (data)); + +- memcpy (data.version, compilation, sizeof (compilation)); ++ data.version = STATDATA_VERSION_FULL; + data.debug_level = debug_level; + data.runtime = time (NULL) - start_time; + data.client_queued = client_queued; +@@ -196,7 +211,7 @@ receive_print_stats (void) + + /* Read as much data as we expect. */ + if (TEMP_FAILURE_RETRY (read (fd, &data, sizeof (data))) != sizeof (data) +- || (memcmp (data.version, compilation, sizeof (compilation)) != 0 ++ || (data.version != STATDATA_VERSION_FULL + /* Yes, this is an assignment! */ + && (errno = EINVAL))) + { diff --git a/glibc.spec b/glibc.spec index c00abcd..1f02d12 100644 --- a/glibc.spec +++ b/glibc.spec @@ -232,6 +232,7 @@ Patch0060: glibc-rh1324623.patch Patch62: glibc-rh1416405.patch Patch63: glibc-rh1498880-1.patch Patch64: glibc-rh1498880-2.patch +Patch65: glibc-nscd-reproducible.patch ############################################################################## # @@ -806,6 +807,7 @@ microbenchmark tests on the system. %patch62 -p1 %patch63 -p1 %patch64 -p1 +%patch65 -p1 ############################################################################## # %%prep - Additional prep required...