Deb.pm: support control.tar.xz
authorRiku Voipio <riku.voipio@linaro.org>
Thu, 19 Oct 2017 10:30:49 +0000 (13:30 +0300)
committerjingui.ren <jingui.ren@samsung.com>
Fri, 25 Jan 2019 06:33:44 +0000 (14:33 +0800)
Add support for uncompressing and hdrmd5 for XZ compressed
control.tar - default on dpkg >= 1.19. Fixes issue #395

Change-Id: I2f18307182591b3965c6c6e70f355ab617dc1533

Build/Deb.pm

index 5713de8..904fca5 100644 (file)
@@ -256,9 +256,14 @@ sub debq {
   $data = substr($data, 8 + 60 + $len);
   if (substr($data, 0, 16) ne 'control.tar.gz  ' &&
       substr($data, 0, 16) ne 'control.tar.gz/ ') {
-    warn("$fn: control.tar.gz is not second ar entry\n");
-    close DEBF unless ref $fn;
-    return ();
+    if (substr($data, 0, 16) eq 'control.tar.xz  ' ||
+        substr($data, 0, 16) eq 'control.tar.xz/ ') {
+      $decompressor = "unxz";
+    } else  {
+      warn("$fn: control.tar is not second ar entry\n");
+      close DEBF unless ref $fn;
+      return ();
+    }
   }
   $len = substr($data, 48, 10);
   if (length($data) < 60+$len) {
@@ -278,7 +283,7 @@ sub debq {
     $data = uncompress($data, $decompressor);
   }
   if (!$data) {
-    warn("$fn: corrupt control.tar.gz file\n");
+    warn("$fn: corrupt control.tar file\n");
     return ();
   }
   my $control;
@@ -288,7 +293,7 @@ sub debq {
     my $len = oct('00'.substr($data, 124,12));
     my $blen = ($len + 1023) & ~511;
     if (length($data) < $blen) {
-      warn("$fn: corrupt control.tar.gz file\n");
+      warn("$fn: corrupt control.tar file\n");
       return ();
     }
     if ($n eq './control' || $n eq "control") {
@@ -390,8 +395,11 @@ sub queryhdrmd5 {
   }
   $data = substr($data, 8 + 60 + $len);
   if (substr($data, 0, 16) ne 'control.tar.gz  ' &&
-      substr($data, 0, 16) ne 'control.tar.gz/ ') {
-    warn("$bin: control.tar.gz is not second ar entry\n");
+      substr($data, 0, 16) ne 'control.tar.gz/ ' &&
+      substr($data, 0, 16) ne 'control.tar.xz  ' &&
+      substr($data, 0, 16) ne 'control.tar.xz/ ')
+   {
+    warn("$bin: control.tar is not second ar entry\n");
     close F;
     return undef;
   }