Closes: #765304
---
 lib/File/StripNondeterminism/handlers/zip.pm | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/lib/File/StripNondeterminism/handlers/zip.pm 
b/lib/File/StripNondeterminism/handlers/zip.pm
index 75e4c7b..b902a23 100644
--- a/lib/File/StripNondeterminism/handlers/zip.pm
+++ b/lib/File/StripNondeterminism/handlers/zip.pm
@@ -62,6 +62,29 @@ sub normalize_member {
        unlink($filename);
 }
 
+sub normalize_extra_fields {
+       my $field = shift;
+
+       my $result = "";
+       my $pos = 0;
+       my ($id, $len);
+
+       # field format: 2 bytes id, 2 bytes data len, n bytes data
+       while (($id, $len) = unpack("SS", substr($field, $pos))) {
+               if ($id == 0x5455) {
+                       # extended timestamp found.
+                       # first byte of data contains flags.
+                       $result .= substr($field, $pos, 5) . pack("L", 
$File::StripNondeterminism::canonical_time // SAFE_EPOCH);
+               } else {
+                       # use the current extra field unmodified.
+                       $result .= substr($field, $pos, $len+4);
+               }
+               $pos += $len + 4;
+       }
+
+       return $result;
+}
+
 sub normalize {
        my ($zip_filename, %options) = @_;
        my $filename_cmp = $options{filename_cmp} || sub { $a cmp $b };
@@ -72,6 +95,7 @@ sub normalize {
                $zip->addMember($member);
                $options{member_normalizer}->($member) if exists 
$options{member_normalizer};
                
$member->setLastModFileDateTimeFromUnix($File::StripNondeterminism::canonical_time
 // SAFE_EPOCH);
+               
$member->cdExtraField(normalize_extra_fields($member->cdExtraField()));
        }
        $zip->overwrite();
        return 1;
-- 
2.1.3


_______________________________________________
Reproducible-builds mailing list
Reproducible-builds@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/reproducible-builds

Reply via email to