Source: viruskiller
Version: 1.03-1+dfsg1-1
Severity: wishlist
Tags: patch
User: [email protected]
Usertags: fileordering
X-Debbugs-Cc: [email protected]

Hi,

Whilst working on the Reproducible Builds effort [0], we noticed
that viruskiller could not be built reproducibly.

This due to the build system assembling the .pak file by iterating
over the filesystem in a non-determinstic order.

Patch attached that uses scandir with the alphasort argument.

 [0] https://reproducible-builds.org/


Regards,

-- 
      ,''`.
     : :'  :     Chris Lamb
     `. `'`      [email protected] / chris-lamb.co.uk
       `-
--- a/debian/patches/reproducible-build.patch   1970-01-01 01:00:00.000000000 
+0100
--- b/debian/patches/reproducible-build.patch   2017-04-19 14:29:49.480885008 
+0100
@@ -0,0 +1,72 @@
+--- viruskiller-1.03-1+dfsg1.orig/src/pak.cpp
++++ viruskiller-1.03-1+dfsg1/src/pak.cpp
+@@ -88,19 +88,19 @@ void countFiles(const char *dirName)
+ 
+ void recurseDirectory(const char *dirName)
+ {
+-      DIR *dirp, *dirp2;
+-      dirent *dfile;
++      int n;
++      DIR *dirp2;
+       gzFile fp;
+       FILE *infile;
+       char filename[1024];
++      struct dirent **namelist;
+ 
+       uLongf cSize = 0;
+       uLongf fSize = 0;
+ 
+-      dirp = opendir(dirName);
+ 
+-      if (dirp == NULL)
+-      {
++      n = scandir(dirName, &namelist, NULL, alphasort);
++      if (n == -1) {
+               printf("%s: Directory does not exist or is not accessible\n", 
dirName);
+               return;
+       }
+@@ -108,14 +108,14 @@ void recurseDirectory(const char *dirNam
+       float percentage;
+       long filesize;
+ 
+-      while ((dfile = readdir(dirp)))
++      while (n--)
+       {
+-              if (dfile->d_name[0] == '.')
++              if (namelist[n]->d_name[0] == '.')
+               {
+                       continue;
+               }
+ 
+-              sprintf(filename, "%s/%s", dirName, dfile->d_name);
++              sprintf(filename, "%s/%s", dirName, namelist[n]->d_name);
+ 
+               dirp2 = opendir(filename);
+ 
+@@ -130,7 +130,7 @@ void recurseDirectory(const char *dirNam
+                       if (!infile)
+                       {
+                               printf("Couldn't open %s for reading!\n", 
filename);
+-                              closedir(dirp);
++                              free(namelist);
+                               fclose(pak);
+                               exit(1);
+                       }
+@@ -162,7 +162,7 @@ void recurseDirectory(const char *dirNam
+                       if (!fp)
+                       {
+                               printf("Couldn't open %s for reading!\n", 
filename);
+-                              closedir(dirp);
++                              free(namelist);
+                               fclose(pak);
+                               exit(1);
+                       }
+@@ -190,7 +190,7 @@ void recurseDirectory(const char *dirNam
+               }
+       }
+ 
+-      closedir(dirp);
++      free(namelist);
+ 
+       dirs++;
+ }
--- a/debian/patches/series     2017-04-19 14:22:26.530841180 +0100
--- b/debian/patches/series     2017-04-19 14:27:26.820224965 +0100
@@ -8,3 +8,4 @@
 0009-start-with-fewer-directories.patch
 0010-mismatched-delete.patch
 0011-remove-bad-gzclose.patch
+reproducible-build.patch

Reply via email to