Rizin
unix-like reverse engineering framework and cli tools
test_bcj_exact_size.c
Go to the documentation of this file.
1 //
7 //
8 // Author: Lasse Collin
9 //
10 // This file has been put into the public domain.
11 // You can do whatever you want with this file.
12 //
14 
15 #include "tests.h"
16 
17 
19 static const uint8_t in[16] = "0123456789ABCDEF";
20 
22 static uint8_t compressed[1024];
23 static size_t compressed_size = 0;
24 
26 static uint8_t out[sizeof(in)];
27 
28 
29 static void
30 compress(void)
31 {
32  // Compress with PowerPC BCJ and LZMA2. PowerPC BCJ is used because
33  // it has fixed 4-byte alignment which makes triggering the potential
34  // bug easy.
35  lzma_options_lzma opt_lzma2;
36  succeed(lzma_lzma_preset(&opt_lzma2, 0));
37 
38  lzma_filter filters[3] = {
39  { .id = LZMA_FILTER_POWERPC, .options = NULL },
40  { .id = LZMA_FILTER_LZMA2, .options = &opt_lzma2 },
41  { .id = LZMA_VLI_UNKNOWN, .options = NULL },
42  };
43 
44  expect(lzma_stream_buffer_encode(filters, LZMA_CHECK_CRC32, NULL,
45  in, sizeof(in),
47  == LZMA_OK);
48 }
49 
50 
51 static void
53 {
55  expect(lzma_stream_decoder(&strm, 10 << 20, 0) == LZMA_OK);
56 
58  strm.next_out = out;
59 
60  while (true) {
62  strm.avail_in = 1;
63 
64  const lzma_ret ret = lzma_code(&strm, LZMA_RUN);
65  if (ret == LZMA_STREAM_END) {
67  expect(strm.total_out == sizeof(in));
68  lzma_end(&strm);
69  return;
70  }
71 
72  expect(ret == LZMA_OK);
73 
74  if (strm.total_out < sizeof(in))
75  strm.avail_out = 1;
76  }
77 }
78 
79 
80 static void
82 {
83  // An empty file with one Block using PowerPC BCJ and LZMA2.
84  static const uint8_t empty_bcj_lzma2[] = {
85  0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00, 0x00, 0x01,
86  0x69, 0x22, 0xDE, 0x36, 0x02, 0x01, 0x05, 0x00,
87  0x21, 0x01, 0x00, 0x00, 0x7F, 0xE0, 0xF1, 0xC8,
88  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89  0x00, 0x01, 0x11, 0x00, 0x3B, 0x96, 0x5F, 0x73,
90  0x90, 0x42, 0x99, 0x0D, 0x01, 0x00, 0x00, 0x00,
91  0x00, 0x01, 0x59, 0x5A
92  };
93 
94  // Decompress without giving any output space.
95  uint64_t memlimit = 1 << 20;
96  size_t in_pos = 0;
97  size_t out_pos = 0;
98  expect(lzma_stream_buffer_decode(&memlimit, 0, NULL,
99  empty_bcj_lzma2, &in_pos, sizeof(empty_bcj_lzma2),
100  out, &out_pos, 0) == LZMA_OK);
101  expect(in_pos == sizeof(empty_bcj_lzma2));
102  expect(out_pos == 0);
103 }
104 
105 
106 extern int
107 main(void)
108 {
109  compress();
110  decompress();
112  return 0;
113 }
@ LZMA_CHECK_CRC32
Definition: check.h:35
#define LZMA_FILTER_POWERPC
Definition: bcj.h:27
const lzma_allocator const uint8_t size_t uint8_t size_t * out_pos
Definition: block.h:528
const lzma_allocator const uint8_t size_t * in_pos
Definition: block.h:579
const lzma_filter * filters
Definition: container.h:315
uint64_t memlimit
Definition: container.h:537
#define NULL
Definition: cris-opc.c:27
static lzma_stream strm
Definition: full_flush.c:20
#define expect(expr, value)
Definition: lz4.c:170
#define LZMA_FILTER_LZMA2
LZMA2 Filter ID.
Definition: lzma12.h:40
unsigned long uint64_t
Definition: sftypes.h:28
unsigned char uint8_t
Definition: sftypes.h:31
Filter options.
Definition: filter.h:43
lzma_vli id
Filter ID.
Definition: filter.h:54
Options specific to the LZMA1 and LZMA2 filters.
Definition: lzma12.h:185
Passing data to and from liblzma.
Definition: base.h:485
uint8_t * next_out
Definition: base.h:490
uint64_t total_in
Definition: base.h:488
size_t avail_out
Definition: base.h:491
const uint8_t * next_in
Definition: base.h:486
uint64_t total_out
Definition: base.h:492
size_t avail_in
Definition: base.h:487
static uint8_t out[sizeof(in)]
Output buffer for decompressing compressed[].
static void compress(void)
static size_t compressed_size
static const uint8_t in[16]
Something to be compressed.
int main(void)
static void decompress(void)
static uint8_t compressed[1024]
in[] after compression
static void decompress_empty(void)
Common definitions for test applications.
#define succeed(test)
Definition: tests.h:27
#define LZMA_VLI_UNKNOWN
VLI value to denote that the value is unknown.
Definition: vli.h:39
lzma_ret
Return values used by several functions in liblzma.
Definition: base.h:57
@ LZMA_STREAM_END
End of stream was reached.
Definition: base.h:63
@ LZMA_OK
Operation completed successfully.
Definition: base.h:58
@ LZMA_RUN
Continue coding.
Definition: base.h:251
#define LZMA_STREAM_INIT
Initialization for lzma_stream.
Definition: base.h:545