Index: tests/test_bcj_exact_size.c |
=================================================================== |
--- tests/test_bcj_exact_size.c (revision 0) |
+++ tests/test_bcj_exact_size.c (revision 0) |
@@ -0,0 +1,112 @@ |
+/////////////////////////////////////////////////////////////////////////////// |
+// |
+/// \file test_bcj_exact_size.c |
+/// \brief Tests BCJ decoding when the output size is known |
+/// |
+/// These tests fail with XZ Utils 5.0.3 and earlier. |
+// |
+// Author: Lasse Collin |
+// |
+// This file has been put into the public domain. |
+// You can do whatever you want with this file. |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+#include "tests.h" |
+ |
+ |
+/// Something to be compressed |
+static const uint8_t in[16] = "0123456789ABCDEF"; |
+ |
+/// in[] after compression |
+static uint8_t compressed[1024]; |
+static size_t compressed_size = 0; |
+ |
+/// Output buffer for decompressing compressed[] |
+static uint8_t out[sizeof(in)]; |
+ |
+ |
+static void |
+compress(void) |
+{ |
+ // Compress with PowerPC BCJ and LZMA2. PowerPC BCJ is used because |
+ // it has fixed 4-byte alignment which makes triggering the potential |
+ // bug easy. |
+ lzma_options_lzma opt_lzma2; |
+ succeed(lzma_lzma_preset(&opt_lzma2, 0)); |
+ |
+ lzma_filter filters[3] = { |
+ { .id = LZMA_FILTER_POWERPC, .options = NULL }, |
+ { .id = LZMA_FILTER_LZMA2, .options = &opt_lzma2 }, |
+ { .id = LZMA_VLI_UNKNOWN, .options = NULL }, |
+ }; |
+ |
+ expect(lzma_stream_buffer_encode(filters, LZMA_CHECK_CRC32, NULL, |
+ in, sizeof(in), |
+ compressed, &compressed_size, sizeof(compressed)) |
+ == LZMA_OK); |
+} |
+ |
+ |
+static void |
+decompress(void) |
+{ |
+ lzma_stream strm = LZMA_STREAM_INIT; |
+ expect(lzma_stream_decoder(&strm, 10 << 20, 0) == LZMA_OK); |
+ |
+ strm.next_in = compressed; |
+ strm.next_out = out; |
+ |
+ while (true) { |
+ if (strm.total_in < compressed_size) |
+ strm.avail_in = 1; |
+ |
+ const lzma_ret ret = lzma_code(&strm, LZMA_RUN); |
+ if (ret == LZMA_STREAM_END) { |
+ expect(strm.total_in == compressed_size); |
+ expect(strm.total_out == sizeof(in)); |
+ return; |
+ } |
+ |
+ expect(ret == LZMA_OK); |
+ |
+ if (strm.total_out < sizeof(in)) |
+ strm.avail_out = 1; |
+ } |
+} |
+ |
+ |
+static void |
+decompress_empty(void) |
+{ |
+ // An empty file with one Block using PowerPC BCJ and LZMA2. |
+ static const uint8_t empty_bcj_lzma2[] = { |
+ 0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00, 0x00, 0x01, |
+ 0x69, 0x22, 0xDE, 0x36, 0x02, 0x01, 0x05, 0x00, |
+ 0x21, 0x01, 0x00, 0x00, 0x7F, 0xE0, 0xF1, 0xC8, |
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
+ 0x00, 0x01, 0x11, 0x00, 0x3B, 0x96, 0x5F, 0x73, |
+ 0x90, 0x42, 0x99, 0x0D, 0x01, 0x00, 0x00, 0x00, |
+ 0x00, 0x01, 0x59, 0x5A |
+ }; |
+ |
+ // Decompress without giving any output space. |
+ uint64_t memlimit = 1 << 20; |
+ size_t in_pos = 0; |
+ size_t out_pos = 0; |
+ expect(lzma_stream_buffer_decode(&memlimit, 0, NULL, |
+ empty_bcj_lzma2, &in_pos, sizeof(empty_bcj_lzma2), |
+ out, &out_pos, 0) == LZMA_OK); |
+ expect(in_pos == sizeof(empty_bcj_lzma2)); |
+ expect(out_pos == 0); |
+} |
+ |
+ |
+extern int |
+main(void) |
+{ |
+ compress(); |
+ decompress(); |
+ decompress_empty(); |
+ return 0; |
+} |
Property changes on: tests/test_bcj_exact_size.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |