wok annotate busybox/stuff/busybox-1.21-xz.u @ rev 14473

gstreamer: update deps+bdeps
author Dominique Corbex <domcox@slitaz.org>
date Thu May 02 22:34:01 2013 +0200 (2013-05-02)
parents
children
rev   line source
pascal@14221 1 --- busybox-1.21.0/archival/libarchive/decompress_unxz.c
pascal@14221 2 +++ busybox-1.21.0/archival/libarchive/decompress_unxz.c
pascal@14221 3 @@ -40,6 +40,7 @@ static uint32_t xz_crc32(const uint8_t *
pascal@14221 4 IF_DESKTOP(long long) int FAST_FUNC
pascal@14221 5 unpack_xz_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
pascal@14221 6 {
pascal@14221 7 + enum xz_ret xz_result;
pascal@14221 8 struct xz_buf iobuf;
pascal@14221 9 struct xz_dec *state;
pascal@14221 10 unsigned char *membuf;
pascal@14221 11 @@ -63,9 +64,8 @@ unpack_xz_stream(transformer_aux_data_t
pascal@14221 12 /* Limit memory usage to about 64 MiB. */
pascal@14221 13 state = xz_dec_init(XZ_DYNALLOC, 64*1024*1024);
pascal@14221 14
pascal@14221 15 + xz_result = X_OK;
pascal@14221 16 while (1) {
pascal@14221 17 - enum xz_ret r;
pascal@14221 18 -
pascal@14221 19 if (iobuf.in_pos == iobuf.in_size) {
pascal@14221 20 int rd = safe_read(src_fd, membuf, BUFSIZ);
pascal@14221 21 if (rd < 0) {
pascal@14221 22 @@ -73,28 +73,57 @@ unpack_xz_stream(transformer_aux_data_t
pascal@14221 23 total = -1;
pascal@14221 24 break;
pascal@14221 25 }
pascal@14221 26 + if (rd == 0 && xz_result == XZ_STREAM_END)
pascal@14221 27 + break;
pascal@14221 28 iobuf.in_size = rd;
pascal@14221 29 iobuf.in_pos = 0;
pascal@14221 30 }
pascal@14221 31 + if (xz_result == XZ_STREAM_END) {
pascal@14221 32 + /*
pascal@14221 33 + * Try to start decoding next concatenated stream.
pascal@14221 34 + * Stream padding must always be a multiple of four
pascal@14221 35 + * bytes to preserve four-byte alignment. To keep the
pascal@14221 36 + * code slightly smaller, we aren't as strict here as
pascal@14221 37 + * the .xz spec requires. We just skip all zero-bytes
pascal@14221 38 + * without checking the alignment and thus can accept
pascal@14221 39 + * files that aren't valid, e.g. the XZ utils test
pascal@14221 40 + * files bad-0pad-empty.xz and bad-0catpad-empty.xz.
pascal@14221 41 + */
pascal@14221 42 + do {
pascal@14221 43 + if (membuf[iobuf.in_pos] != 0) {
pascal@14221 44 + xz_dec_reset(state);
pascal@14221 45 + goto do_run;
pascal@14221 46 + }
pascal@14221 47 + iobuf.in_pos++;
pascal@14221 48 + } while (iobuf.in_pos < iobuf.in_size);
pascal@14221 49 + }
pascal@14221 50 + do_run:
pascal@14221 51 // bb_error_msg(">in pos:%d size:%d out pos:%d size:%d",
pascal@14221 52 // iobuf.in_pos, iobuf.in_size, iobuf.out_pos, iobuf.out_size);
pascal@14221 53 - r = xz_dec_run(state, &iobuf);
pascal@14221 54 + xz_result = xz_dec_run(state, &iobuf);
pascal@14221 55 // bb_error_msg("<in pos:%d size:%d out pos:%d size:%d r:%d",
pascal@14221 56 -// iobuf.in_pos, iobuf.in_size, iobuf.out_pos, iobuf.out_size, r);
pascal@14221 57 +// iobuf.in_pos, iobuf.in_size, iobuf.out_pos, iobuf.out_size, xz_result);
pascal@14221 58 if (iobuf.out_pos) {
pascal@14221 59 xwrite(dst_fd, iobuf.out, iobuf.out_pos);
pascal@14221 60 IF_DESKTOP(total += iobuf.out_pos;)
pascal@14221 61 iobuf.out_pos = 0;
pascal@14221 62 }
pascal@14221 63 - if (r == XZ_STREAM_END) {
pascal@14221 64 - break;
pascal@14221 65 + if (xz_result == XZ_STREAM_END) {
pascal@14221 66 + /*
pascal@14221 67 + * Can just "break;" here, if not for concatenated
pascal@14221 68 + * .xz streams.
pascal@14221 69 + * Checking for padding may require buffer
pascal@14221 70 + * replenishment. Can't do it here.
pascal@14221 71 + */
pascal@14221 72 + continue;
pascal@14221 73 }
pascal@14221 74 - if (r != XZ_OK && r != XZ_UNSUPPORTED_CHECK) {
pascal@14221 75 + if (xz_result != XZ_OK && xz_result != XZ_UNSUPPORTED_CHECK) {
pascal@14221 76 bb_error_msg("corrupted data");
pascal@14221 77 total = -1;
pascal@14221 78 break;
pascal@14221 79 }
pascal@14221 80 }
pascal@14221 81 +
pascal@14221 82 xz_dec_end(state);
pascal@14221 83 free(membuf);
pascal@14221 84