From c17be3cbfc58e5b54ae1d5ae4714460d7ae2e15c Mon Sep 17 00:00:00 2001 From: Guillem Jover Date: Tue, 7 Jan 2014 04:00:47 +0100 Subject: 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. --- debian/changelog | 2 ++ dpkg-deb/build.c | 6 +++++- dpkg-deb/dpkg-deb.h | 2 +- dpkg-deb/extract.c | 13 +++++++++++-- man/deb.5 | 7 +++++-- 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 -- cgit v1.2.3