wok diff busybox/stuff/busybox-1.21-xz.u @ rev 14463

Up: ndoutils (1.5.2)
author Eric Joseph-Alexandre <erjo@slitaz.org>
date Sat Apr 27 03:10:35 2013 +0200 (2013-04-27)
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/busybox/stuff/busybox-1.21-xz.u	Sat Apr 27 03:10:35 2013 +0200
     1.3 @@ -0,0 +1,84 @@
     1.4 +--- busybox-1.21.0/archival/libarchive/decompress_unxz.c
     1.5 ++++ busybox-1.21.0/archival/libarchive/decompress_unxz.c
     1.6 +@@ -40,6 +40,7 @@ static uint32_t xz_crc32(const uint8_t *
     1.7 + IF_DESKTOP(long long) int FAST_FUNC
     1.8 + unpack_xz_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
     1.9 + {
    1.10 ++	enum xz_ret xz_result;
    1.11 + 	struct xz_buf iobuf;
    1.12 + 	struct xz_dec *state;
    1.13 + 	unsigned char *membuf;
    1.14 +@@ -63,9 +64,8 @@ unpack_xz_stream(transformer_aux_data_t
    1.15 + 	/* Limit memory usage to about 64 MiB. */
    1.16 + 	state = xz_dec_init(XZ_DYNALLOC, 64*1024*1024);
    1.17 + 
    1.18 ++	xz_result = X_OK;
    1.19 + 	while (1) {
    1.20 +-		enum xz_ret r;
    1.21 +-
    1.22 + 		if (iobuf.in_pos == iobuf.in_size) {
    1.23 + 			int rd = safe_read(src_fd, membuf, BUFSIZ);
    1.24 + 			if (rd < 0) {
    1.25 +@@ -73,28 +73,57 @@ unpack_xz_stream(transformer_aux_data_t
    1.26 + 				total = -1;
    1.27 + 				break;
    1.28 + 			}
    1.29 ++			if (rd == 0 && xz_result == XZ_STREAM_END)
    1.30 ++				break;
    1.31 + 			iobuf.in_size = rd;
    1.32 + 			iobuf.in_pos = 0;
    1.33 + 		}
    1.34 ++		if (xz_result == XZ_STREAM_END) {
    1.35 ++			/*
    1.36 ++			 * Try to start decoding next concatenated stream.
    1.37 ++			 * Stream padding must always be a multiple of four
    1.38 ++			 * bytes to preserve four-byte alignment. To keep the
    1.39 ++			 * code slightly smaller, we aren't as strict here as
    1.40 ++			 * the .xz spec requires. We just skip all zero-bytes
    1.41 ++			 * without checking the alignment and thus can accept
    1.42 ++			 * files that aren't valid, e.g. the XZ utils test
    1.43 ++			 * files bad-0pad-empty.xz and bad-0catpad-empty.xz.
    1.44 ++			 */
    1.45 ++			do {
    1.46 ++				if (membuf[iobuf.in_pos] != 0) {
    1.47 ++					xz_dec_reset(state);
    1.48 ++					goto do_run;
    1.49 ++				}
    1.50 ++				iobuf.in_pos++;
    1.51 ++			} while (iobuf.in_pos < iobuf.in_size);
    1.52 ++		}
    1.53 ++ do_run:
    1.54 + //		bb_error_msg(">in pos:%d size:%d out pos:%d size:%d",
    1.55 + //				iobuf.in_pos, iobuf.in_size, iobuf.out_pos, iobuf.out_size);
    1.56 +-		r = xz_dec_run(state, &iobuf);
    1.57 ++		xz_result = xz_dec_run(state, &iobuf);
    1.58 + //		bb_error_msg("<in pos:%d size:%d out pos:%d size:%d r:%d",
    1.59 +-//				iobuf.in_pos, iobuf.in_size, iobuf.out_pos, iobuf.out_size, r);
    1.60 ++//				iobuf.in_pos, iobuf.in_size, iobuf.out_pos, iobuf.out_size, xz_result);
    1.61 + 		if (iobuf.out_pos) {
    1.62 + 			xwrite(dst_fd, iobuf.out, iobuf.out_pos);
    1.63 + 			IF_DESKTOP(total += iobuf.out_pos;)
    1.64 + 			iobuf.out_pos = 0;
    1.65 + 		}
    1.66 +-		if (r == XZ_STREAM_END) {
    1.67 +-			break;
    1.68 ++		if (xz_result == XZ_STREAM_END) {
    1.69 ++			/*
    1.70 ++			 * Can just "break;" here, if not for concatenated
    1.71 ++			 * .xz streams.
    1.72 ++			 * Checking for padding may require buffer
    1.73 ++			 * replenishment. Can't do it here.
    1.74 ++			 */
    1.75 ++			continue;
    1.76 + 		}
    1.77 +-		if (r != XZ_OK && r != XZ_UNSUPPORTED_CHECK) {
    1.78 ++		if (xz_result != XZ_OK && xz_result != XZ_UNSUPPORTED_CHECK) {
    1.79 + 			bb_error_msg("corrupted data");
    1.80 + 			total = -1;
    1.81 + 			break;
    1.82 + 		}
    1.83 + 	}
    1.84 ++
    1.85 + 	xz_dec_end(state);
    1.86 + 	free(membuf);
    1.87 +