Просмотр исходного кода

dpkg-deb: Accept other compressions for control.tar .deb member

This includes no compression (control.tar) or xz compression
(control.tar.xz).

There's really no point allowing the deprecated lzma, or the inferior
bzip2 at this time, when gzip and xz are superior in either speed or
compression ratio.
Guillem Jover лет назад: 12
Родитель
Сommit
c17be3cbfc
5 измененных файлов с 24 добавлено и 6 удалено
  1. 2 0
      debian/changelog
  2. 5 1
      dpkg-deb/build.c
  3. 1 1
      dpkg-deb/dpkg-deb.h
  4. 11 2
      dpkg-deb/extract.c
  5. 5 2
      man/deb.5

+ 2 - 0
debian/changelog

@@ -43,6 +43,8 @@ dpkg (1.17.6) UNRELEASED; urgency=low
   * Do not produce .deb archives with uncompressed gzip members on
     «dpkg-deb -Zgzip -z0», instead create them as non-compressed members,
     as if -Znone had been passed, as documented. Closes: #718295
+  * Add support for .deb archives with a control member not compressed
+    (control.tar) or compressed with xz (control.tar.xz).
 
   [ Updated dpkg translations ]
   * Swedish (Peter Krefting).

+ 5 - 1
dpkg-deb/build.c

@@ -552,10 +552,14 @@ do_build(const char *const *argv)
              debar, err.str);
   } else if (deb_format.major == 2) {
     const char deb_magic[] = ARCHIVEVERSION "\n";
+    char adminmember[16 + 1];
+
+    sprintf(adminmember, "%s%s", ADMINMEMBER,
+            compressor_get_extension(compressor_type_gzip));
 
     dpkg_ar_put_magic(debar, arfd);
     dpkg_ar_member_put_mem(debar, arfd, DEBMAGIC, deb_magic, strlen(deb_magic));
-    dpkg_ar_member_put_file(debar, arfd, ADMINMEMBER, gzfd, -1);
+    dpkg_ar_member_put_file(debar, arfd, adminmember, gzfd, -1);
   } else {
     internerr("unknown deb format version %d.%d", deb_format.major, deb_format.minor);
   }

+ 1 - 1
dpkg-deb/dpkg-deb.h

@@ -70,7 +70,7 @@ extern struct compress_params compress_params;
 #define OLDOLDDEBDIR		".DEBIAN"
 
 #define DEBMAGIC		"debian-binary"
-#define ADMINMEMBER		"control.tar.gz"
+#define ADMINMEMBER		"control.tar"
 #define DATAMEMBER		"data.tar"
 
 #define MAXFILENAME 2048

+ 11 - 2
dpkg-deb/extract.c

@@ -178,9 +178,18 @@ extracthalf(const char *debar, const char *dir,
         if (fd_skip(arfd, memberlen + (memberlen & 1), &err) < 0)
           ohshit(_("cannot skip archive member from '%s': %s"), debar, err.str);
       } else {
-	if (strncmp(arh.ar_name, ADMINMEMBER, sizeof(arh.ar_name)) == 0)
+        if (strncmp(arh.ar_name, ADMINMEMBER, strlen(ADMINMEMBER)) == 0) {
+          const char *extension = arh.ar_name + strlen(ADMINMEMBER);
+
 	  adminmember = 1;
-	else {
+          decompressor = compressor_find_by_extension(extension);
+          if (decompressor != compressor_type_none &&
+              decompressor != compressor_type_gzip &&
+              decompressor != compressor_type_xz)
+            ohshit(_("archive '%s' uses unknown compression for member '%.*s', "
+                     "giving up"),
+                   debar, (int)sizeof(arh.ar_name), arh.ar_name);
+        } else {
           if (adminmember != 1)
             ohshit(_("archive '%s' has premature member '%.*s' before '%s', "
                      "giving up"),

+ 5 - 2
man/deb.5

@@ -66,8 +66,11 @@ be able to safely continue, unless it encounters an unexpected member
 in the archive (except at the end), as described below.
 .PP
 The second required member is named
-.BR control.tar.gz .
-It is a gzipped tar archive containing the package control information,
+.BR control.tar .
+It is a tar archive containing the package control information, either
+not compressed (supported since dpkg 1.17.6), or compressed with
+gzip (with \fB.gz\fP extension) or
+xz (with \fB.xz\fP extension, supported since 1.17.6),
 as a series of plain files, of which the file
 .B control
 is mandatory and contains the core control information. The control