Source: bind9
Version: 1:9.10.3.dfsg.P4-10
Severity: wishlist
Tags: patch
User: reproducible-bui...@lists.alioth.debian.org
Usertags: timestamps
X-Debbugs-Cc: reproducible-bui...@lists.alioth.debian.org

Hi,

Whilst working on the "reproducible builds" effort [0], we noticed that bind9 
could not be built reproducibly.

Patch attached.

 [0] https://wiki.debian.org/ReproducibleBuilds



Regards,

-- 
      ,''`.
     : :'  :     Chris Lamb
     `. `'`      la...@debian.org / chris-lamb.co.uk
       `-
--- a/debian/patches/80_reproducible_build.diff 1970-01-01 02:00:00.000000000 
+0200
--- b/debian/patches/80_reproducible_build.diff 2016-06-23 16:47:56.902997121 
+0200
@@ -0,0 +1,58 @@
+--- bind9-9.10.3.dfsg.P4.orig/lib/dns/gen.c
++++ bind9-9.10.3.dfsg.P4/lib/dns/gen.c
+@@ -38,6 +38,8 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <time.h>
++#include <errno.h>
++#include <limits.h>
+ 
+ #ifdef WIN32
+ #include "gen-win32.h"
+@@ -543,6 +545,9 @@ main(int argc, char **argv) {
+       char *prefix = NULL;
+       char *suffix = NULL;
+       char *file = NULL;
++      char *source_date_epoch;
++      unsigned long long epoch;
++      char *endptr;
+       isc_dir_t dir;
+ 
+       for (i = 0; i < TYPENAMES; i++)
+@@ -633,8 +638,34 @@ main(int argc, char **argv) {
+       INSIST(n > 0 && (unsigned)n < sizeof(srcdir));
+       sd(0, "", buf, filetype);
+ 
+-      if (time(&now) != -1) {
+-              if ((tm = localtime(&now)) != NULL && tm->tm_year > 104) {
++      source_date_epoch = getenv("SOURCE_DATE_EPOCH");
++      if (source_date_epoch) {
++              errno = 0;
++              epoch = strtoull(source_date_epoch, &endptr, 10);
++              if ((errno == ERANGE && (epoch == ULLONG_MAX || epoch == 0))
++                              || (errno != 0 && epoch == 0)) {
++                      fprintf(stderr, "Environment variable 
$SOURCE_DATE_EPOCH: strtoull: %s\n", strerror(errno));
++                      exit(EXIT_FAILURE);
++              }
++              if (endptr == source_date_epoch) {
++                      fprintf(stderr, "Environment variable 
$SOURCE_DATE_EPOCH: No digits were found: %s\n", endptr);
++                      exit(EXIT_FAILURE);
++              }
++              if (*endptr != '\0') {
++                      fprintf(stderr, "Environment variable 
$SOURCE_DATE_EPOCH: Trailing garbage: %s\n", endptr);
++                      exit(EXIT_FAILURE);
++              }
++              if (epoch > ULONG_MAX) {
++                      fprintf(stderr, "Environment variable 
$SOURCE_DATE_EPOCH: value must be smaller than or equal to: %lu but was found 
to be: %llu \n", ULONG_MAX, epoch);
++                      exit(EXIT_FAILURE);
++              }
++              now = epoch;
++      } else {
++              time(&now);
++      }
++
++      if (now != -1) {
++              if ((tm = gmtime(&now)) != NULL && tm->tm_year > 104) {
+                       n = snprintf(year, sizeof(year), "-%d",
+                                    tm->tm_year + 1900);
+                       INSIST(n > 0 && (unsigned)n < sizeof(year));
--- a/debian/patches/series     2016-06-23 15:18:50.923042149 +0200
--- b/debian/patches/series     2016-06-23 16:47:54.270973512 +0200
@@ -10,3 +10,4 @@
 34_prepare_native_pkcs11.diff
 70_precise_time.diff
 75_ctxstart_no_sighandling.diff
+80_reproducible_build.diff

Reply via email to