On Sat, 2012-12-22 at 10:21 -0800, Jonathan Nieder wrote: > > What happens if a stream ends at a buffer boundary, followed by > padding? Or if padding doesn't fit in the buffer, for that > matter? > > Hope that helps, Please find attached new debdiff with fix of above mentioned issues. Cheers,
diff -Nru busybox-1.20.0/debian/changelog busybox-1.20.0/debian/changelog
--- busybox-1.20.0/debian/changelog 2012-09-20 08:32:55.000000000 +0200
+++ busybox-1.20.0/debian/changelog 2012-12-21 21:59:39.000000000 +0100
@@ -1,3 +1,10 @@
+busybox (1:1.20.0-7.1) unstable; urgency=low
+
+ * Fix decompression of multi stream XZ compressed files
+ (Closes: Bug#bug#686502)
+
+ -- Abou Al Montacir <abou.almontacir@sfr.fr> Thu, 21 Dec 2012 22:00:00 +0100
+
busybox (1:1.20.0-7) unstable; urgency=low
* set CONFIG_FEATURE_COPYBUF_KB from 4 to 64 for all flavours. This
diff -Nru busybox-1.20.0/debian/patches/fix-unxz-with-multiple-streams.patch busybox-1.20.0/debian/patches/fix-unxz-with-multiple-streams.patch
--- busybox-1.20.0/debian/patches/fix-unxz-with-multiple-streams.patch 1970-01-01 01:00:00.000000000 +0100
+++ busybox-1.20.0/debian/patches/fix-unxz-with-multiple-streams.patch 2012-12-24 23:12:05.000000000 +0100
@@ -0,0 +1,74 @@
+Author: Abou Al Montacir <abou.almontacir@sfr.fr>
+Purpose: Fix decompression of multi stream XZ compressed files
+ (Closes: bug#686502)
+
+--- busybox-1.20.0/archival/libarchive/decompress_unxz.c 2012-12-24 21:21:47.000000000 +0100
++++ busybox-1.20.0/debian/build/deb/archival/libarchive/decompress_unxz.c 2012-12-24 23:10:35.000000000 +0100
+@@ -44,6 +44,7 @@
+ struct xz_dec *state;
+ unsigned char *membuf;
+ IF_DESKTOP(long long) int total = 0;
++ enum xz_ret r;
+
+ if (!global_crc32_table)
+ global_crc32_table = crc32_filltable(NULL, /*endian:*/ 0);
+@@ -59,12 +60,10 @@
+ strcpy((char*)membuf, HEADER_MAGIC);
+ iobuf.in_size = HEADER_MAGIC_SIZE;
+ } /* else: let xz code read & check it */
+-
+- /* Limit memory usage to about 64 MiB. */
+- state = xz_dec_init(XZ_DYNALLOC, 64*1024*1024);
++ /* First stream is identical to starting a new stream after finishing decoding an old one */
++ r = XZ_STREAM_END;
+
+ while (1) {
+- enum xz_ret r;
+
+ if (iobuf.in_pos == iobuf.in_size) {
+ int rd = safe_read(src_fd, membuf, BUFSIZ);
+@@ -73,9 +72,25 @@
+ total = -1;
+ break;
+ }
++ /* No more bytes in stream. Stop */
++ if (rd == 0) {
++ break;
++ }
+ iobuf.in_size = rd;
+ iobuf.in_pos = 0;
+ }
++ if (r == XZ_STREAM_END) {
++ /* Eat padding. Stream never starts with zeros */
++ while ((iobuf.in_pos < iobuf.in_size) && (iobuf.in[iobuf.in_pos] == 0)) {
++ iobuf.in_pos += 1;
++ }
++ /* Reached end of buffer. Fill it again from stream */
++ if (iobuf.in_pos == iobuf.in_size) {
++ continue;
++ }
++ /* Initialize decoder for new stream. Limit memory usage to about 64 MiB. */
++ state = xz_dec_init(XZ_DYNALLOC, 64*1024*1024);
++ }
+ // bb_error_msg(">in pos:%d size:%d out pos:%d size:%d",
+ // iobuf.in_pos, iobuf.in_size, iobuf.out_pos, iobuf.out_size);
+ r = xz_dec_run(state, &iobuf);
+@@ -87,7 +102,9 @@
+ iobuf.out_pos = 0;
+ }
+ if (r == XZ_STREAM_END) {
+- break;
++ xz_dec_end(state);
++ /* Look for any other streams */
++ continue;
+ }
+ if (r != XZ_OK && r != XZ_UNSUPPORTED_CHECK) {
+ bb_error_msg("corrupted data");
+@@ -95,7 +112,6 @@
+ break;
+ }
+ }
+- xz_dec_end(state);
+ free(membuf);
+
+ return total;
diff -Nru busybox-1.20.0/debian/patches/series busybox-1.20.0/debian/patches/series
--- busybox-1.20.0/debian/patches/series 2012-09-19 22:58:00.000000000 +0200
+++ busybox-1.20.0/debian/patches/series 2012-12-20 21:54:21.000000000 +0100
@@ -25,3 +25,6 @@
dont-force-no-alignment-for-s390.patch
stop-checking-ancient-kernel-version.patch
+
+# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=686502
+fix-unxz-with-multiple-streams.patch
Attachment:
signature.asc
Description: This is a digitally signed message part