summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillem Jover <guillem@debian.org>2014-01-07 04:00:47 +0100
committerGuillem Jover <guillem@debian.org>2014-01-15 15:02:16 +0100
commitc17be3cbfc58e5b54ae1d5ae4714460d7ae2e15c (patch)
tree5320508d5f1e73e9cbc532f0358d8c0ea534551d
parente7e052b462e794165411aa12b36324a66dcb6700 (diff)
downloaddpkg-c17be3cbfc58e5b54ae1d5ae4714460d7ae2e15c.tar.gz
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.
-rw-r--r--debian/changelog2
-rw-r--r--dpkg-deb/build.c6
-rw-r--r--dpkg-deb/dpkg-deb.h2
-rw-r--r--dpkg-deb/extract.c13
-rw-r--r--man/deb.57
5 files changed, 24 insertions, 6 deletions
diff --git a/debian/changelog b/debian/changelog
index 68d0e177b..1e7314c07 100644
--- a/debian/changelog
+++ b/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).
diff --git a/dpkg-deb/build.c b/dpkg-deb/build.c
index c49dbc0e3..e816e0ab6 100644
--- a/dpkg-deb/build.c
+++ b/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);
}
diff --git a/dpkg-deb/dpkg-deb.h b/dpkg-deb/dpkg-deb.h
index 13106be44..1238d1407 100644
--- a/dpkg-deb/dpkg-deb.h
+++ b/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
diff --git a/dpkg-deb/extract.c b/dpkg-deb/extract.c
index 4b1e1f26d..55fdfcb19 100644
--- a/dpkg-deb/extract.c
+++ b/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"),
diff --git a/man/deb.5 b/man/deb.5
index 2bd682010..5ed33fc64 100644
--- a/man/deb.5
+++ b/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