]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/libarchive/libarchive/test/test_read_format_rar5.c
MFC r349527,349538:
[FreeBSD/stable/10.git] / contrib / libarchive / libarchive / test / test_read_format_rar5.c
1 /*-
2  * Copyright (c) 2018 Grzegorz Antoniak
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 #include "test.h"
26
27 /* Some tests will want to calculate some CRC32's, and this header can
28  * help. */
29 #define __LIBARCHIVE_BUILD
30 #include <archive_crc32.h>
31 #include <archive_endian.h>
32
33 #define PROLOGUE(reffile) \
34         struct archive_entry *ae; \
35         struct archive *a; \
36         \
37         (void) a;  /* Make the compiler happy if we won't use this variables */ \
38         (void) ae; /* in the test cases. */ \
39         \
40         extract_reference_file(reffile); \
41         assert((a = archive_read_new()) != NULL); \
42         assertA(0 == archive_read_support_filter_all(a)); \
43         assertA(0 == archive_read_support_format_all(a)); \
44         assertA(0 == archive_read_open_filename(a, reffile, 10240))
45
46 #define PROLOGUE_MULTI(reffile) \
47         struct archive_entry *ae; \
48         struct archive *a; \
49         \
50         (void) a; \
51         (void) ae; \
52         \
53         extract_reference_files(reffile); \
54         assert((a = archive_read_new()) != NULL); \
55         assertA(0 == archive_read_support_filter_all(a)); \
56         assertA(0 == archive_read_support_format_all(a)); \
57         assertA(0 == archive_read_open_filenames(a, reffile, 10240))
58
59
60 #define EPILOGUE() \
61         assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); \
62         assertEqualInt(ARCHIVE_OK, archive_read_free(a))
63
64 static
65 int verify_data(const uint8_t* data_ptr, int magic, int size) {
66         int i = 0;
67
68         /* This is how the test data inside test files was generated;
69          * we are re-generating it here and we check if our re-generated
70          * test data is the same as in the test file. If this test is
71          * failing it's either because there's a bug in the test case,
72          * or the unpacked data is corrupted. */
73
74         for(i = 0; i < size / 4; ++i) {
75                 const int k = i + 1;
76                 const signed int* lptr = (const signed int*) &data_ptr[i * 4];
77                 signed int val = k * k - 3 * k + (1 + magic);
78
79                 if(val < 0)
80                         val = 0;
81
82                 /* *lptr is a value inside unpacked test file, val is the
83                  * value that should be in the unpacked test file. */
84
85                 if(archive_le32dec(lptr) != (uint32_t) val)
86                         return 0;
87         }
88
89         return 1;
90 }
91
92 static
93 int extract_one(struct archive* a, struct archive_entry* ae, uint32_t crc) {
94         la_ssize_t fsize, bytes_read;
95         uint8_t* buf;
96         int ret = 1;
97         uint32_t computed_crc;
98
99         fsize = (la_ssize_t) archive_entry_size(ae);
100         buf = malloc(fsize);
101         if(buf == NULL)
102                 return 1;
103
104         bytes_read = archive_read_data(a, buf, fsize);
105         if(bytes_read != fsize) {
106                 assertEqualInt(bytes_read, fsize);
107                 goto fn_exit;
108         }
109
110         computed_crc = crc32(0, buf, fsize);
111         assertEqualInt(computed_crc, crc);
112         ret = 0;
113
114 fn_exit:
115         free(buf);
116         return ret;
117 }
118
119 DEFINE_TEST(test_read_format_rar5_set_format)
120 {
121         struct archive *a;
122         struct archive_entry *ae;
123         const char reffile[] = "test_read_format_rar5_stored.rar";
124
125         extract_reference_file(reffile);
126         assert((a = archive_read_new()) != NULL);
127         assertA(0 == archive_read_support_filter_all(a));
128         assertA(0 == archive_read_set_format(a, ARCHIVE_FORMAT_RAR_V5));
129         assertA(0 == archive_read_open_filename(a, reffile, 10240));
130         assertA(0 == archive_read_next_header(a, &ae));
131         EPILOGUE();
132 }
133
134 DEFINE_TEST(test_read_format_rar5_stored)
135 {
136         const char helloworld_txt[] = "hello libarchive test suite!\n";
137         la_ssize_t file_size = sizeof(helloworld_txt) - 1;
138         char buff[64];
139
140         PROLOGUE("test_read_format_rar5_stored.rar");
141
142         assertA(0 == archive_read_next_header(a, &ae));
143         assertEqualString("helloworld.txt", archive_entry_pathname(ae));
144         assertA((int) archive_entry_mtime(ae) > 0);
145         assertA((int) archive_entry_ctime(ae) == 0);
146         assertA((int) archive_entry_atime(ae) == 0);
147         assertEqualInt(file_size, archive_entry_size(ae));
148         assertEqualInt(33188, archive_entry_mode(ae));
149         assertA(file_size == archive_read_data(a, buff, file_size));
150         assertEqualMem(buff, helloworld_txt, file_size);
151         assertEqualInt(archive_entry_is_encrypted(ae), 0);
152
153         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
154
155         EPILOGUE();
156 }
157
158 DEFINE_TEST(test_read_format_rar5_compressed)
159 {
160         const int DATA_SIZE = 1200;
161         uint8_t buff[1200];
162
163         PROLOGUE("test_read_format_rar5_compressed.rar");
164
165         assertA(0 == archive_read_next_header(a, &ae));
166         assertEqualString("test.bin", archive_entry_pathname(ae));
167         assertA((int) archive_entry_mtime(ae) > 0);
168         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
169         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
170         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
171         verify_data(buff, 0, DATA_SIZE);
172
173         EPILOGUE();
174 }
175
176 DEFINE_TEST(test_read_format_rar5_multiple_files)
177 {
178         const int DATA_SIZE = 4096;
179         uint8_t buff[4096];
180
181         PROLOGUE("test_read_format_rar5_multiple_files.rar");
182
183         /* There should be 4 files inside this test file. Check for their
184          * existence, and also check the contents of those test files. */
185
186         assertA(0 == archive_read_next_header(a, &ae));
187         assertEqualString("test1.bin", archive_entry_pathname(ae));
188         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
189         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
190         assertA(verify_data(buff, 1, DATA_SIZE));
191
192         assertA(0 == archive_read_next_header(a, &ae));
193         assertEqualString("test2.bin", archive_entry_pathname(ae));
194         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
195         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
196         assertA(verify_data(buff, 2, DATA_SIZE));
197
198         assertA(0 == archive_read_next_header(a, &ae));
199         assertEqualString("test3.bin", archive_entry_pathname(ae));
200         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
201         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
202         assertA(verify_data(buff, 3, DATA_SIZE));
203
204         assertA(0 == archive_read_next_header(a, &ae));
205         assertEqualString("test4.bin", archive_entry_pathname(ae));
206         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
207         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
208         assertA(verify_data(buff, 4, DATA_SIZE));
209
210         /* There should be no more files in this archive. */
211
212         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
213         EPILOGUE();
214 }
215
216 /* This test is really the same as the test above, but it deals with a solid
217  * archive instead of a regular archive. The test solid archive contains the
218  * same set of files as regular test archive, but it's size is 2x smaller,
219  * because solid archives reuse the window buffer from previous compressed
220  * files, so it's able to compress lots of small files more effectively. */
221
222 DEFINE_TEST(test_read_format_rar5_multiple_files_solid)
223 {
224         const int DATA_SIZE = 4096;
225         uint8_t buff[4096];
226
227         PROLOGUE("test_read_format_rar5_multiple_files_solid.rar");
228
229         assertA(0 == archive_read_next_header(a, &ae));
230         assertEqualString("test1.bin", archive_entry_pathname(ae));
231         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
232         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
233         assertA(verify_data(buff, 1, DATA_SIZE));
234
235         assertA(0 == archive_read_next_header(a, &ae));
236         assertEqualString("test2.bin", archive_entry_pathname(ae));
237         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
238         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
239         assertA(verify_data(buff, 2, DATA_SIZE));
240
241         assertA(0 == archive_read_next_header(a, &ae));
242         assertEqualString("test3.bin", archive_entry_pathname(ae));
243         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
244         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
245         assertA(verify_data(buff, 3, DATA_SIZE));
246
247         assertA(0 == archive_read_next_header(a, &ae));
248         assertEqualString("test4.bin", archive_entry_pathname(ae));
249         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
250         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
251         assertA(verify_data(buff, 4, DATA_SIZE));
252
253         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
254         EPILOGUE();
255 }
256
257 DEFINE_TEST(test_read_format_rar5_multiarchive_skip_all)
258 {
259         const char* reffiles[] = {
260                 "test_read_format_rar5_multiarchive.part01.rar",
261                 "test_read_format_rar5_multiarchive.part02.rar",
262                 "test_read_format_rar5_multiarchive.part03.rar",
263                 "test_read_format_rar5_multiarchive.part04.rar",
264                 "test_read_format_rar5_multiarchive.part05.rar",
265                 "test_read_format_rar5_multiarchive.part06.rar",
266                 "test_read_format_rar5_multiarchive.part07.rar",
267                 "test_read_format_rar5_multiarchive.part08.rar",
268                 NULL
269         };
270
271         PROLOGUE_MULTI(reffiles);
272         assertA(0 == archive_read_next_header(a, &ae));
273         assertEqualString("home/antek/temp/build/unrar5/libarchive/bin/bsdcat_test", archive_entry_pathname(ae));
274         assertA(0 == archive_read_next_header(a, &ae));
275         assertEqualString("home/antek/temp/build/unrar5/libarchive/bin/bsdtar_test", archive_entry_pathname(ae));
276         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
277         EPILOGUE();
278 }
279
280 DEFINE_TEST(test_read_format_rar5_multiarchive_skip_all_but_first)
281 {
282         const char* reffiles[] = {
283                 "test_read_format_rar5_multiarchive.part01.rar",
284                 "test_read_format_rar5_multiarchive.part02.rar",
285                 "test_read_format_rar5_multiarchive.part03.rar",
286                 "test_read_format_rar5_multiarchive.part04.rar",
287                 "test_read_format_rar5_multiarchive.part05.rar",
288                 "test_read_format_rar5_multiarchive.part06.rar",
289                 "test_read_format_rar5_multiarchive.part07.rar",
290                 "test_read_format_rar5_multiarchive.part08.rar",
291                 NULL
292         };
293
294         PROLOGUE_MULTI(reffiles);
295         assertA(0 == archive_read_next_header(a, &ae));
296         assertA(0 == extract_one(a, ae, 0x35277473));
297         assertA(0 == archive_read_next_header(a, &ae));
298         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
299         EPILOGUE();
300 }
301
302 DEFINE_TEST(test_read_format_rar5_multiarchive_skip_all_but_second)
303 {
304         const char* reffiles[] = {
305                 "test_read_format_rar5_multiarchive.part01.rar",
306                 "test_read_format_rar5_multiarchive.part02.rar",
307                 "test_read_format_rar5_multiarchive.part03.rar",
308                 "test_read_format_rar5_multiarchive.part04.rar",
309                 "test_read_format_rar5_multiarchive.part05.rar",
310                 "test_read_format_rar5_multiarchive.part06.rar",
311                 "test_read_format_rar5_multiarchive.part07.rar",
312                 "test_read_format_rar5_multiarchive.part08.rar",
313                 NULL
314         };
315
316         PROLOGUE_MULTI(reffiles);
317         assertA(0 == archive_read_next_header(a, &ae));
318         assertA(0 == archive_read_next_header(a, &ae));
319         assertA(0 == extract_one(a, ae, 0xE59665F8));
320         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
321         EPILOGUE();
322 }
323
324 DEFINE_TEST(test_read_format_rar5_blake2)
325 {
326         const la_ssize_t proper_size = 814;
327         uint8_t buf[814];
328
329         PROLOGUE("test_read_format_rar5_blake2.rar");
330         assertA(0 == archive_read_next_header(a, &ae));
331         assertEqualInt(proper_size, archive_entry_size(ae));
332
333         /* Should blake2 calculation fail, we'll get a failure return
334          * value from archive_read_data(). */
335
336         assertA(proper_size == archive_read_data(a, buf, proper_size));
337
338         /* To be extra pedantic, let's also check crc32 of the poem. */
339         assertEqualInt(crc32(0, buf, proper_size), 0x7E5EC49E);
340
341         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
342         EPILOGUE();
343 }
344
345 DEFINE_TEST(test_read_format_rar5_arm_filter)
346 {
347         /* This test unpacks a file that uses an ARM filter. The DELTA
348          * and X86 filters are tested implicitly in the "multiarchive_skip"
349          * test. */
350
351         const la_ssize_t proper_size = 90808;
352         uint8_t buf[90808];
353
354         PROLOGUE("test_read_format_rar5_arm.rar");
355         assertA(0 == archive_read_next_header(a, &ae));
356         assertEqualInt(proper_size, archive_entry_size(ae));
357         assertA(proper_size == archive_read_data(a, buf, proper_size));
358
359         /* Yes, RARv5 unpacker itself should calculate the CRC, but in case
360          * the DONT_FAIL_ON_CRC_ERROR define option is enabled during compilation,
361          * let's still fail the test if the unpacked data is wrong. */
362         assertEqualInt(crc32(0, buf, proper_size), 0x886F91EB);
363
364         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
365         EPILOGUE();
366 }
367
368 DEFINE_TEST(test_read_format_rar5_stored_skip_all)
369 {
370         const char* fname = "test_read_format_rar5_stored_manyfiles.rar";
371
372         PROLOGUE(fname);
373         assertA(0 == archive_read_next_header(a, &ae));
374         assertEqualString("make_uue.tcl", archive_entry_pathname(ae));
375         assertA(0 == archive_read_next_header(a, &ae));
376         assertEqualString("cebula.txt", archive_entry_pathname(ae));
377         assertA(0 == archive_read_next_header(a, &ae));
378         assertEqualString("test.bin", archive_entry_pathname(ae));
379         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
380         EPILOGUE();
381 }
382
383 DEFINE_TEST(test_read_format_rar5_stored_skip_in_part)
384 {
385         const char* fname = "test_read_format_rar5_stored_manyfiles.rar";
386         char buf[6];
387
388         /* Skip first, extract in part rest. */
389
390         PROLOGUE(fname);
391         assertA(0 == archive_read_next_header(a, &ae));
392         assertEqualString("make_uue.tcl", archive_entry_pathname(ae));
393         assertA(0 == archive_read_next_header(a, &ae));
394         assertEqualString("cebula.txt", archive_entry_pathname(ae));
395         assertA(6 == archive_read_data(a, buf, 6));
396         assertEqualInt(0, memcmp(buf, "Cebula", 6));
397         assertA(0 == archive_read_next_header(a, &ae));
398         assertEqualString("test.bin", archive_entry_pathname(ae));
399         assertA(4 == archive_read_data(a, buf, 4));
400         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
401         EPILOGUE();
402 }
403
404 DEFINE_TEST(test_read_format_rar5_stored_skip_all_but_first)
405 {
406         const char* fname = "test_read_format_rar5_stored_manyfiles.rar";
407         char buf[405];
408
409         /* Extract first, skip rest. */
410
411         PROLOGUE(fname);
412         assertA(0 == archive_read_next_header(a, &ae));
413         assertEqualString("make_uue.tcl", archive_entry_pathname(ae));
414         assertA(405 == archive_read_data(a, buf, sizeof(buf)));
415         assertA(0 == archive_read_next_header(a, &ae));
416         assertEqualString("cebula.txt", archive_entry_pathname(ae));
417         assertA(0 == archive_read_next_header(a, &ae));
418         assertEqualString("test.bin", archive_entry_pathname(ae));
419         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
420         EPILOGUE();
421 }
422
423 DEFINE_TEST(test_read_format_rar5_stored_skip_all_in_part)
424 {
425         const char* fname = "test_read_format_rar5_stored_manyfiles.rar";
426         char buf[4];
427
428         /* Extract in part all */
429
430         PROLOGUE(fname);
431         assertA(0 == archive_read_next_header(a, &ae));
432         assertEqualString("make_uue.tcl", archive_entry_pathname(ae));
433         assertA(4 == archive_read_data(a, buf, 4));
434         assertA(0 == archive_read_next_header(a, &ae));
435         assertEqualString("cebula.txt", archive_entry_pathname(ae));
436         assertA(4 == archive_read_data(a, buf, 4));
437         assertA(0 == archive_read_next_header(a, &ae));
438         assertEqualString("test.bin", archive_entry_pathname(ae));
439         assertA(4 == archive_read_data(a, buf, 4));
440         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
441         EPILOGUE();
442 }
443
444 DEFINE_TEST(test_read_format_rar5_multiarchive_solid_extr_all)
445 {
446         const char* reffiles[] = {
447                 "test_read_format_rar5_multiarchive_solid.part01.rar",
448                 "test_read_format_rar5_multiarchive_solid.part02.rar",
449                 "test_read_format_rar5_multiarchive_solid.part03.rar",
450                 "test_read_format_rar5_multiarchive_solid.part04.rar",
451                 NULL
452         };
453
454         PROLOGUE_MULTI(reffiles);
455         assertA(0 == archive_read_next_header(a, &ae));
456         assertEqualString("cebula.txt", archive_entry_pathname(ae));
457         assertA(0 == extract_one(a, ae, 0x7E5EC49E));
458
459         assertA(0 == archive_read_next_header(a, &ae));
460         assertEqualString("test.bin", archive_entry_pathname(ae));
461         assertA(0 == extract_one(a, ae, 0x7cca70cd));
462
463         assertA(0 == archive_read_next_header(a, &ae));
464         assertEqualString("test1.bin", archive_entry_pathname(ae));
465         assertA(0 == extract_one(a, ae, 0x7e13b2c6));
466
467         assertA(0 == archive_read_next_header(a, &ae));
468         assertEqualString("test2.bin", archive_entry_pathname(ae));
469         assertA(0 == extract_one(a, ae, 0xf166afcb));
470
471         assertA(0 == archive_read_next_header(a, &ae));
472         assertEqualString("test3.bin", archive_entry_pathname(ae));
473         assertA(0 == extract_one(a, ae, 0x9fb123d9));
474
475         assertA(0 == archive_read_next_header(a, &ae));
476         assertEqualString("test4.bin", archive_entry_pathname(ae));
477         assertA(0 == extract_one(a, ae, 0x10c43ed4));
478
479         assertA(0 == archive_read_next_header(a, &ae));
480         assertEqualString("test5.bin", archive_entry_pathname(ae));
481         assertA(0 == extract_one(a, ae, 0xb9d155f2));
482
483         assertA(0 == archive_read_next_header(a, &ae));
484         assertEqualString("test6.bin", archive_entry_pathname(ae));
485         assertA(0 == extract_one(a, ae, 0x36a448ff));
486
487         assertA(0 == archive_read_next_header(a, &ae));
488         assertEqualString("elf-Linux-ARMv7-ls", archive_entry_pathname(ae));
489         assertA(0 == extract_one(a, ae, 0x886F91EB));
490
491         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
492         EPILOGUE();
493 }
494
495 DEFINE_TEST(test_read_format_rar5_multiarchive_solid_skip_all)
496 {
497         const char* reffiles[] = {
498                 "test_read_format_rar5_multiarchive_solid.part01.rar",
499                 "test_read_format_rar5_multiarchive_solid.part02.rar",
500                 "test_read_format_rar5_multiarchive_solid.part03.rar",
501                 "test_read_format_rar5_multiarchive_solid.part04.rar",
502                 NULL
503         };
504
505         PROLOGUE_MULTI(reffiles);
506         assertA(0 == archive_read_next_header(a, &ae));
507         assertEqualString("cebula.txt", archive_entry_pathname(ae));
508         assertA(0 == archive_read_next_header(a, &ae));
509         assertEqualString("test.bin", archive_entry_pathname(ae));
510         assertA(0 == archive_read_next_header(a, &ae));
511         assertEqualString("test1.bin", archive_entry_pathname(ae));
512         assertA(0 == archive_read_next_header(a, &ae));
513         assertEqualString("test2.bin", archive_entry_pathname(ae));
514         assertA(0 == archive_read_next_header(a, &ae));
515         assertEqualString("test3.bin", archive_entry_pathname(ae));
516         assertA(0 == archive_read_next_header(a, &ae));
517         assertEqualString("test4.bin", archive_entry_pathname(ae));
518         assertA(0 == archive_read_next_header(a, &ae));
519         assertEqualString("test5.bin", archive_entry_pathname(ae));
520         assertA(0 == archive_read_next_header(a, &ae));
521         assertEqualString("test6.bin", archive_entry_pathname(ae));
522         assertA(0 == archive_read_next_header(a, &ae));
523         assertEqualString("elf-Linux-ARMv7-ls", archive_entry_pathname(ae));
524         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
525         EPILOGUE();
526 }
527
528 DEFINE_TEST(test_read_format_rar5_multiarchive_solid_skip_all_but_first)
529 {
530         const char* reffiles[] = {
531                 "test_read_format_rar5_multiarchive_solid.part01.rar",
532                 "test_read_format_rar5_multiarchive_solid.part02.rar",
533                 "test_read_format_rar5_multiarchive_solid.part03.rar",
534                 "test_read_format_rar5_multiarchive_solid.part04.rar",
535                 NULL
536         };
537
538         PROLOGUE_MULTI(reffiles);
539         assertA(0 == archive_read_next_header(a, &ae));
540         assertEqualString("cebula.txt", archive_entry_pathname(ae));
541         assertA(0 == extract_one(a, ae, 0x7E5EC49E));
542         assertA(0 == archive_read_next_header(a, &ae));
543         assertEqualString("test.bin", archive_entry_pathname(ae));
544         assertA(0 == archive_read_next_header(a, &ae));
545         assertEqualString("test1.bin", archive_entry_pathname(ae));
546         assertA(0 == archive_read_next_header(a, &ae));
547         assertEqualString("test2.bin", archive_entry_pathname(ae));
548         assertA(0 == archive_read_next_header(a, &ae));
549         assertEqualString("test3.bin", archive_entry_pathname(ae));
550         assertA(0 == archive_read_next_header(a, &ae));
551         assertEqualString("test4.bin", archive_entry_pathname(ae));
552         assertA(0 == archive_read_next_header(a, &ae));
553         assertEqualString("test5.bin", archive_entry_pathname(ae));
554         assertA(0 == archive_read_next_header(a, &ae));
555         assertEqualString("test6.bin", archive_entry_pathname(ae));
556         assertA(0 == archive_read_next_header(a, &ae));
557         assertEqualString("elf-Linux-ARMv7-ls", archive_entry_pathname(ae));
558         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
559         EPILOGUE();
560 }
561
562 /* "skip_all_but_scnd" -> am I hitting the test name limit here after
563  * expansion of "scnd" to "second"? */
564
565 DEFINE_TEST(test_read_format_rar5_multiarchive_solid_skip_all_but_scnd)
566 {
567         const char* reffiles[] = {
568                 "test_read_format_rar5_multiarchive_solid.part01.rar",
569                 "test_read_format_rar5_multiarchive_solid.part02.rar",
570                 "test_read_format_rar5_multiarchive_solid.part03.rar",
571                 "test_read_format_rar5_multiarchive_solid.part04.rar",
572                 NULL
573         };
574
575         PROLOGUE_MULTI(reffiles);
576         assertA(0 == archive_read_next_header(a, &ae));
577         assertEqualString("cebula.txt", archive_entry_pathname(ae));
578         assertA(0 == archive_read_next_header(a, &ae));
579         assertEqualString("test.bin", archive_entry_pathname(ae));
580         assertA(0 == extract_one(a, ae, 0x7CCA70CD));
581         assertA(0 == archive_read_next_header(a, &ae));
582         assertEqualString("test1.bin", archive_entry_pathname(ae));
583         assertA(0 == archive_read_next_header(a, &ae));
584         assertEqualString("test2.bin", archive_entry_pathname(ae));
585         assertA(0 == archive_read_next_header(a, &ae));
586         assertEqualString("test3.bin", archive_entry_pathname(ae));
587         assertA(0 == archive_read_next_header(a, &ae));
588         assertEqualString("test4.bin", archive_entry_pathname(ae));
589         assertA(0 == archive_read_next_header(a, &ae));
590         assertEqualString("test5.bin", archive_entry_pathname(ae));
591         assertA(0 == archive_read_next_header(a, &ae));
592         assertEqualString("test6.bin", archive_entry_pathname(ae));
593         assertA(0 == archive_read_next_header(a, &ae));
594         assertEqualString("elf-Linux-ARMv7-ls", archive_entry_pathname(ae));
595         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
596         EPILOGUE();
597 }
598
599 DEFINE_TEST(test_read_format_rar5_multiarchive_solid_skip_all_but_third)
600 {
601         const char* reffiles[] = {
602                 "test_read_format_rar5_multiarchive_solid.part01.rar",
603                 "test_read_format_rar5_multiarchive_solid.part02.rar",
604                 "test_read_format_rar5_multiarchive_solid.part03.rar",
605                 "test_read_format_rar5_multiarchive_solid.part04.rar",
606                 NULL
607         };
608
609         PROLOGUE_MULTI(reffiles);
610         assertA(0 == archive_read_next_header(a, &ae));
611         assertEqualString("cebula.txt", archive_entry_pathname(ae));
612         assertA(0 == archive_read_next_header(a, &ae));
613         assertEqualString("test.bin", archive_entry_pathname(ae));
614         assertA(0 == archive_read_next_header(a, &ae));
615         assertEqualString("test1.bin", archive_entry_pathname(ae));
616         assertA(0 == extract_one(a, ae, 0x7E13B2C6));
617         assertA(0 == archive_read_next_header(a, &ae));
618         assertEqualString("test2.bin", archive_entry_pathname(ae));
619         assertA(0 == archive_read_next_header(a, &ae));
620         assertEqualString("test3.bin", archive_entry_pathname(ae));
621         assertA(0 == archive_read_next_header(a, &ae));
622         assertEqualString("test4.bin", archive_entry_pathname(ae));
623         assertA(0 == archive_read_next_header(a, &ae));
624         assertEqualString("test5.bin", archive_entry_pathname(ae));
625         assertA(0 == archive_read_next_header(a, &ae));
626         assertEqualString("test6.bin", archive_entry_pathname(ae));
627         assertA(0 == archive_read_next_header(a, &ae));
628         assertEqualString("elf-Linux-ARMv7-ls", archive_entry_pathname(ae));
629         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
630         EPILOGUE();
631 }
632
633 DEFINE_TEST(test_read_format_rar5_multiarchive_solid_skip_all_but_last)
634 {
635         const char* reffiles[] = {
636                 "test_read_format_rar5_multiarchive_solid.part01.rar",
637                 "test_read_format_rar5_multiarchive_solid.part02.rar",
638                 "test_read_format_rar5_multiarchive_solid.part03.rar",
639                 "test_read_format_rar5_multiarchive_solid.part04.rar",
640                 NULL
641         };
642
643         PROLOGUE_MULTI(reffiles);
644         assertA(0 == archive_read_next_header(a, &ae));
645         assertEqualString("cebula.txt", archive_entry_pathname(ae));
646         assertA(0 == archive_read_next_header(a, &ae));
647         assertEqualString("test.bin", archive_entry_pathname(ae));
648         assertA(0 == archive_read_next_header(a, &ae));
649         assertEqualString("test1.bin", archive_entry_pathname(ae));
650         assertA(0 == archive_read_next_header(a, &ae));
651         assertEqualString("test2.bin", archive_entry_pathname(ae));
652         assertA(0 == archive_read_next_header(a, &ae));
653         assertEqualString("test3.bin", archive_entry_pathname(ae));
654         assertA(0 == archive_read_next_header(a, &ae));
655         assertEqualString("test4.bin", archive_entry_pathname(ae));
656         assertA(0 == archive_read_next_header(a, &ae));
657         assertEqualString("test5.bin", archive_entry_pathname(ae));
658         assertA(0 == archive_read_next_header(a, &ae));
659         assertEqualString("test6.bin", archive_entry_pathname(ae));
660         assertA(0 == archive_read_next_header(a, &ae));
661         assertEqualString("elf-Linux-ARMv7-ls", archive_entry_pathname(ae));
662         assertA(0 == extract_one(a, ae, 0x886F91EB));
663         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
664         EPILOGUE();
665 }
666
667 DEFINE_TEST(test_read_format_rar5_solid_skip_all)
668 {
669         const char* reffile = "test_read_format_rar5_solid.rar";
670
671         /* Skip all */
672
673         PROLOGUE(reffile);
674         assertA(0 == archive_read_next_header(a, &ae));
675         assertEqualString("test.bin", archive_entry_pathname(ae));
676         assertA(0 == archive_read_next_header(a, &ae));
677         assertEqualString("test1.bin", archive_entry_pathname(ae));
678         assertA(0 == archive_read_next_header(a, &ae));
679         assertEqualString("test2.bin", archive_entry_pathname(ae));
680         assertA(0 == archive_read_next_header(a, &ae));
681         assertEqualString("test3.bin", archive_entry_pathname(ae));
682         assertA(0 == archive_read_next_header(a, &ae));
683         assertEqualString("test4.bin", archive_entry_pathname(ae));
684         assertA(0 == archive_read_next_header(a, &ae));
685         assertEqualString("test5.bin", archive_entry_pathname(ae));
686         assertA(0 == archive_read_next_header(a, &ae));
687         assertEqualString("test6.bin", archive_entry_pathname(ae));
688         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
689         EPILOGUE();
690 }
691
692 DEFINE_TEST(test_read_format_rar5_solid_skip_all_but_first)
693 {
694         const char* reffile = "test_read_format_rar5_solid.rar";
695
696         /* Extract first, skip rest */
697
698         PROLOGUE(reffile);
699         assertA(0 == archive_read_next_header(a, &ae));
700         assertEqualString("test.bin", archive_entry_pathname(ae));
701         assertA(0 == extract_one(a, ae, 0x7CCA70CD));
702         assertA(0 == archive_read_next_header(a, &ae));
703         assertEqualString("test1.bin", archive_entry_pathname(ae));
704         assertA(0 == archive_read_next_header(a, &ae));
705         assertEqualString("test2.bin", archive_entry_pathname(ae));
706         assertA(0 == archive_read_next_header(a, &ae));
707         assertEqualString("test3.bin", archive_entry_pathname(ae));
708         assertA(0 == archive_read_next_header(a, &ae));
709         assertEqualString("test4.bin", archive_entry_pathname(ae));
710         assertA(0 == archive_read_next_header(a, &ae));
711         assertEqualString("test5.bin", archive_entry_pathname(ae));
712         assertA(0 == archive_read_next_header(a, &ae));
713         assertEqualString("test6.bin", archive_entry_pathname(ae));
714         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
715         EPILOGUE();
716 }
717
718 DEFINE_TEST(test_read_format_rar5_solid_skip_all_but_second)
719 {
720         const char* reffile = "test_read_format_rar5_solid.rar";
721
722         /* Skip first, extract second, skip rest */
723
724         PROLOGUE(reffile);
725         assertA(0 == archive_read_next_header(a, &ae));
726         assertEqualString("test.bin", archive_entry_pathname(ae));
727         assertA(0 == archive_read_next_header(a, &ae));
728         assertEqualString("test1.bin", archive_entry_pathname(ae));
729         assertA(0 == extract_one(a, ae, 0x7E13B2C6));
730         assertA(0 == archive_read_next_header(a, &ae));
731         assertEqualString("test2.bin", archive_entry_pathname(ae));
732         assertA(0 == archive_read_next_header(a, &ae));
733         assertEqualString("test3.bin", archive_entry_pathname(ae));
734         assertA(0 == archive_read_next_header(a, &ae));
735         assertEqualString("test4.bin", archive_entry_pathname(ae));
736         assertA(0 == archive_read_next_header(a, &ae));
737         assertEqualString("test5.bin", archive_entry_pathname(ae));
738         assertA(0 == archive_read_next_header(a, &ae));
739         assertEqualString("test6.bin", archive_entry_pathname(ae));
740         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
741         EPILOGUE();
742 }
743
744 DEFINE_TEST(test_read_format_rar5_solid_skip_all_but_last)
745 {
746         const char* reffile = "test_read_format_rar5_solid.rar";
747
748         /* Skip all but last, extract last */
749
750         PROLOGUE(reffile);
751         assertA(0 == archive_read_next_header(a, &ae));
752         assertEqualString("test.bin", archive_entry_pathname(ae));
753         assertA(0 == archive_read_next_header(a, &ae));
754         assertEqualString("test1.bin", archive_entry_pathname(ae));
755         assertA(0 == archive_read_next_header(a, &ae));
756         assertEqualString("test2.bin", archive_entry_pathname(ae));
757         assertA(0 == archive_read_next_header(a, &ae));
758         assertEqualString("test3.bin", archive_entry_pathname(ae));
759         assertA(0 == archive_read_next_header(a, &ae));
760         assertEqualString("test4.bin", archive_entry_pathname(ae));
761         assertA(0 == archive_read_next_header(a, &ae));
762         assertEqualString("test5.bin", archive_entry_pathname(ae));
763         assertA(0 == archive_read_next_header(a, &ae));
764         assertEqualString("test6.bin", archive_entry_pathname(ae));
765         assertA(0 == extract_one(a, ae, 0x36A448FF));
766         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
767         EPILOGUE();
768 }
769
770 DEFINE_TEST(test_read_format_rar5_extract_win32)
771 {
772         PROLOGUE("test_read_format_rar5_win32.rar");
773         assertA(0 == archive_read_next_header(a, &ae));
774         assertEqualString("testdir", archive_entry_pathname(ae));
775         assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755);
776         assertA(0 == extract_one(a, ae, 0));
777         assertA(0 == archive_read_next_header(a, &ae));
778         assertEqualString("test.bin", archive_entry_pathname(ae));
779         assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
780         assertA(0 == extract_one(a, ae, 0x7CCA70CD));
781         assertA(0 == archive_read_next_header(a, &ae));
782         assertEqualString("test1.bin", archive_entry_pathname(ae));
783         assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
784         assertA(0 == extract_one(a, ae, 0x7E13B2C6));
785         assertA(0 == archive_read_next_header(a, &ae));
786         /* Read only file */
787         assertEqualString("test2.bin", archive_entry_pathname(ae));
788         assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0444);
789         assertA(0 == extract_one(a, ae, 0xF166AFCB));
790         assertA(0 == archive_read_next_header(a, &ae));
791         assertEqualString("test3.bin", archive_entry_pathname(ae));
792         assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
793         assertA(0 == extract_one(a, ae, 0x9FB123D9));
794         assertA(0 == archive_read_next_header(a, &ae));
795         assertEqualString("test4.bin", archive_entry_pathname(ae));
796         assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
797         assertA(0 == extract_one(a, ae, 0x10C43ED4));
798         assertA(0 == archive_read_next_header(a, &ae));
799         assertEqualString("test5.bin", archive_entry_pathname(ae));
800         assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
801         assertA(0 == extract_one(a, ae, 0xB9D155F2));
802         assertA(0 == archive_read_next_header(a, &ae));
803         assertEqualString("test6.bin", archive_entry_pathname(ae));
804         assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
805         assertA(0 == extract_one(a, ae, 0x36A448FF));
806         EPILOGUE();
807 }
808
809 DEFINE_TEST(test_read_format_rar5_block_by_block)
810 {
811         /* This test uses strange buffer sizes intentionally. */
812
813         struct archive_entry *ae;
814         struct archive *a;
815         uint8_t buf[173];
816         int bytes_read;
817         uint32_t computed_crc = 0;
818
819         extract_reference_file("test_read_format_rar5_compressed.rar");
820         assert((a = archive_read_new()) != NULL);
821         assertA(0 == archive_read_support_filter_all(a));
822         assertA(0 == archive_read_support_format_all(a));
823         assertA(0 == archive_read_open_filename(a, "test_read_format_rar5_compressed.rar", 130));
824         assertA(0 == archive_read_next_header(a, &ae));
825         assertEqualString("test.bin", archive_entry_pathname(ae));
826         assertEqualInt(1200, archive_entry_size(ae));
827
828         /* File size is 1200 bytes, we're reading it using a buffer of 173 bytes.
829          * Libarchive is configured to use a buffer of 130 bytes. */
830
831         while(1) {
832                 /* archive_read_data should return one of:
833                  * a) 0, if there is no more data to be read,
834                  * b) negative value, if there was an error,
835                  * c) positive value, meaning how many bytes were read.
836                  */
837
838                 bytes_read = archive_read_data(a, buf, sizeof(buf));
839                 assertA(bytes_read >= 0);
840                 if(bytes_read <= 0)
841                         break;
842
843                 computed_crc = crc32(computed_crc, buf, bytes_read);
844         }
845
846         assertEqualInt(computed_crc, 0x7CCA70CD);
847         EPILOGUE();
848 }
849
850 DEFINE_TEST(test_read_format_rar5_owner)
851 {
852         const int DATA_SIZE = 5;
853         uint8_t buff[5];
854
855         PROLOGUE("test_read_format_rar5_owner.rar");
856
857         assertA(0 == archive_read_next_header(a, &ae));
858         assertEqualString("root.txt", archive_entry_pathname(ae));
859         assertEqualString("root", archive_entry_uname(ae));
860         assertEqualString("wheel", archive_entry_gname(ae));
861         assertA((int) archive_entry_mtime(ae) > 0);
862         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
863         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
864
865         assertA(0 == archive_read_next_header(a, &ae));
866         assertEqualString("nobody.txt", archive_entry_pathname(ae));
867         assertEqualString("nobody", archive_entry_uname(ae));
868         assertEqualString("nogroup", archive_entry_gname(ae));
869         assertA((int) archive_entry_mtime(ae) > 0);
870         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
871         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
872
873         assertA(0 == archive_read_next_header(a, &ae));
874         assertEqualString("numeric.txt", archive_entry_pathname(ae));
875         assertEqualInt(9999, archive_entry_uid(ae));
876         assertEqualInt(8888, archive_entry_gid(ae));
877         assertA((int) archive_entry_mtime(ae) > 0);
878         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
879         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
880
881         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
882
883         EPILOGUE();
884 }
885
886 DEFINE_TEST(test_read_format_rar5_symlink)
887 {
888         const int DATA_SIZE = 5;
889         uint8_t buff[5];
890
891         PROLOGUE("test_read_format_rar5_symlink.rar");
892
893         assertA(0 == archive_read_next_header(a, &ae));
894         assertEqualString("file.txt", archive_entry_pathname(ae));
895         assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
896         assertA((int) archive_entry_mtime(ae) > 0);
897         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
898         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
899
900         assertA(0 == archive_read_next_header(a, &ae));
901         assertEqualString("symlink.txt", archive_entry_pathname(ae));
902         assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
903         assertEqualString("file.txt", archive_entry_symlink(ae));
904         assertEqualInt(AE_SYMLINK_TYPE_FILE, archive_entry_symlink_type(ae));
905         assertA(0 == archive_read_data(a, NULL, archive_entry_size(ae)));
906
907         assertA(0 == archive_read_next_header(a, &ae));
908         assertEqualString("dirlink", archive_entry_pathname(ae));
909         assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
910         assertEqualString("dir", archive_entry_symlink(ae));
911         assertEqualInt(AE_SYMLINK_TYPE_DIRECTORY, archive_entry_symlink_type(ae));
912         assertA(0 == archive_read_data(a, NULL, archive_entry_size(ae)));
913
914         assertA(0 == archive_read_next_header(a, &ae));
915         assertEqualString("dir", archive_entry_pathname(ae));
916         assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
917         assertA(0 == archive_read_data(a, NULL, archive_entry_size(ae)));
918
919         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
920
921         EPILOGUE();
922 }
923
924 DEFINE_TEST(test_read_format_rar5_hardlink)
925 {
926         const int DATA_SIZE = 5;
927         uint8_t buff[5];
928
929         PROLOGUE("test_read_format_rar5_hardlink.rar");
930
931         assertA(0 == archive_read_next_header(a, &ae));
932         assertEqualString("file.txt", archive_entry_pathname(ae));
933         assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
934         assertA((int) archive_entry_mtime(ae) > 0);
935         assertEqualInt(DATA_SIZE, archive_entry_size(ae));
936         assertA(DATA_SIZE == archive_read_data(a, buff, DATA_SIZE));
937
938         assertA(0 == archive_read_next_header(a, &ae));
939         assertEqualString("hardlink.txt", archive_entry_pathname(ae));
940         assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
941         assertEqualString("file.txt", archive_entry_hardlink(ae));
942         assertA(0 == archive_read_data(a, NULL, archive_entry_size(ae)));
943
944         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
945
946         EPILOGUE();
947 }
948
949 DEFINE_TEST(test_read_format_rar5_extra_field_version)
950 {
951         PROLOGUE("test_read_format_rar5_extra_field_version.rar");
952
953         assertA(0 == archive_read_next_header(a, &ae));
954         assertEqualString("bin/2to3;1", archive_entry_pathname(ae));
955         assertA(0 == extract_one(a, ae, 0xF24181B7));
956
957         assertA(0 == archive_read_next_header(a, &ae));
958         assertEqualString("bin/2to3", archive_entry_pathname(ae));
959         assertA(0 == extract_one(a, ae, 0xF24181B7));
960
961         assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
962
963         EPILOGUE();
964 }
965
966 DEFINE_TEST(test_read_format_rar5_readtables_overflow)
967 {
968         uint8_t buf[16];
969
970         PROLOGUE("test_read_format_rar5_readtables_overflow.rar");
971
972         assertA(0 == archive_read_next_header(a, &ae));
973         /* This archive is invalid. However, processing it shouldn't cause any
974          * buffer overflow errors during reading rar5 tables. */
975         assertA(archive_read_data(a, buf, sizeof(buf)) <= 0);
976
977         /* This test only cares about not returning success here. */
978         assertA(ARCHIVE_OK != archive_read_next_header(a, &ae));
979
980         EPILOGUE();
981 }
982
983 DEFINE_TEST(test_read_format_rar5_leftshift1)
984 {
985         uint8_t buf[16];
986
987         PROLOGUE("test_read_format_rar5_leftshift1.rar");
988
989         assertA(0 == archive_read_next_header(a, &ae));
990         /* This archive is invalid. However, processing it shouldn't cause any
991          * errors related to undefined operations when using -fsanitize. */
992         assertA(archive_read_data(a, buf, sizeof(buf)) <= 0);
993
994         /* This test only cares about not returning success here. */
995         assertA(ARCHIVE_OK != archive_read_next_header(a, &ae));
996
997         EPILOGUE();
998 }
999
1000 DEFINE_TEST(test_read_format_rar5_leftshift2)
1001 {
1002         uint8_t buf[16];
1003
1004         PROLOGUE("test_read_format_rar5_leftshift2.rar");
1005
1006         assertA(0 == archive_read_next_header(a, &ae));
1007
1008         /* This archive is invalid. However, processing it shouldn't cause any
1009          * errors related to undefined operations when using -fsanitize. */
1010         assertA(archive_read_data(a, buf, sizeof(buf)) <= 0);
1011
1012         /* This test only cares about not returning success here. */
1013         assertA(ARCHIVE_OK != archive_read_next_header(a, &ae));
1014
1015         EPILOGUE();
1016 }
1017
1018 DEFINE_TEST(test_read_format_rar5_truncated_huff)
1019 {
1020         uint8_t buf[16];
1021
1022         PROLOGUE("test_read_format_rar5_truncated_huff.rar");
1023
1024         assertA(0 == archive_read_next_header(a, &ae));
1025
1026         /* This archive is invalid. However, processing it shouldn't cause any
1027          * errors related to undefined operations when using -fsanitize. */
1028         assertA(archive_read_data(a, buf, sizeof(buf)) <= 0);
1029
1030         /* This test only cares about not returning success here. */
1031         assertA(ARCHIVE_OK != archive_read_next_header(a, &ae));
1032
1033         EPILOGUE();
1034 }
1035
1036 DEFINE_TEST(test_read_format_rar5_invalid_dict_reference)
1037 {
1038         uint8_t buf[16];
1039
1040         PROLOGUE("test_read_format_rar5_invalid_dict_reference.rar");
1041
1042         /* This test should fail on parsing the header. */
1043         assertA(archive_read_next_header(a, &ae) != ARCHIVE_OK);
1044
1045         /* This archive is invalid. However, processing it shouldn't cause any
1046          * errors related to buffer underflow when using -fsanitize. */
1047         assertA(archive_read_data(a, buf, sizeof(buf)) <= 0);
1048
1049         /* This test only cares about not returning success here. */
1050         assertA(ARCHIVE_OK != archive_read_next_header(a, &ae));
1051
1052         EPILOGUE();
1053 }
1054
1055 DEFINE_TEST(test_read_format_rar5_distance_overflow)
1056 {
1057         uint8_t buf[16];
1058
1059         PROLOGUE("test_read_format_rar5_distance_overflow.rar");
1060
1061         assertA(0 == archive_read_next_header(a, &ae));
1062
1063         /* This archive is invalid. However, processing it shouldn't cause any
1064          * errors related to variable overflows when using -fsanitize. */
1065         assertA(archive_read_data(a, buf, sizeof(buf)) <= 0);
1066
1067         /* This test only cares about not returning success here. */
1068         assertA(ARCHIVE_OK != archive_read_next_header(a, &ae));
1069
1070         EPILOGUE();
1071 }
1072
1073 DEFINE_TEST(test_read_format_rar5_nonempty_dir_stream)
1074 {
1075         uint8_t buf[16];
1076
1077         PROLOGUE("test_read_format_rar5_nonempty_dir_stream.rar");
1078
1079         assertA(0 == archive_read_next_header(a, &ae));
1080
1081         /* This archive is invalid. However, processing it shouldn't cause any
1082          * errors related to buffer overflows when using -fsanitize. */
1083         assertA(archive_read_data(a, buf, sizeof(buf)) <= 0);
1084
1085         /* This test only cares about not returning success here. */
1086         assertA(ARCHIVE_OK != archive_read_next_header(a, &ae));
1087
1088         EPILOGUE();
1089 }
1090
1091 DEFINE_TEST(test_read_format_rar5_fileattr)
1092 {
1093         unsigned long set, clear, flag;
1094
1095         flag = 0;
1096
1097         PROLOGUE("test_read_format_rar5_fileattr.rar");
1098
1099         assertA(0 == archive_read_next_header(a, &ae));
1100         assertEqualInt(archive_entry_mode(ae), 0444 | AE_IFREG);
1101         assertEqualString("readonly.txt", archive_entry_pathname(ae));
1102         assertEqualString("rdonly", archive_entry_fflags_text(ae));
1103         archive_entry_fflags(ae, &set, &clear);
1104 #if defined(__FreeBSD__)
1105         flag = UF_READONLY;
1106 #elif defined(_WIN32) && !defined(CYGWIN)
1107         flag = FILE_ATTRIBUTE_READONLY;
1108 #endif
1109         assertEqualInt(flag, set & flag);
1110
1111         assertA(0 == archive_read_next_header(a, &ae));
1112         assertEqualInt(archive_entry_mode(ae), 0644 | AE_IFREG);
1113         assertEqualString("hidden.txt", archive_entry_pathname(ae));
1114         assertEqualString("hidden", archive_entry_fflags_text(ae));
1115         archive_entry_fflags(ae, &set, &clear);
1116 #if defined(__FreeBSD__)
1117         flag = UF_HIDDEN;
1118 #elif defined(_WIN32) && !defined(CYGWIN)
1119         flag = FILE_ATTRIBUTE_HIDDEN;
1120 #endif
1121         assertEqualInt(flag, set & flag);
1122
1123         assertA(0 == archive_read_next_header(a, &ae));
1124         assertEqualInt(archive_entry_mode(ae), 0644 | AE_IFREG);
1125         assertEqualString("system.txt", archive_entry_pathname(ae));
1126         assertEqualString("system", archive_entry_fflags_text(ae));
1127         archive_entry_fflags(ae, &set, &clear);
1128 #if defined(__FreeBSD__)
1129         flag = UF_SYSTEM;;
1130 #elif defined(_WIN32) && !defined(CYGWIN)
1131         flag = FILE_ATTRIBUTE_SYSTEM;
1132 #endif
1133         assertEqualInt(flag, set & flag);
1134
1135         assertA(0 == archive_read_next_header(a, &ae));
1136         assertEqualInt(archive_entry_mode(ae), 0444 | AE_IFREG);
1137         assertEqualString("ro_hidden.txt", archive_entry_pathname(ae));
1138         assertEqualString("rdonly,hidden", archive_entry_fflags_text(ae));
1139         archive_entry_fflags(ae, &set, &clear);
1140 #if defined(__FreeBSD__)
1141         flag = UF_READONLY | UF_HIDDEN;
1142 #elif defined(_WIN32) && !defined(CYGWIN)
1143         flag = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN;
1144 #endif
1145         assertEqualInt(flag, set & flag);
1146
1147         assertA(0 == archive_read_next_header(a, &ae));
1148         assertEqualInt(archive_entry_mode(ae), 0555 | AE_IFDIR);
1149         assertEqualString("dir_readonly", archive_entry_pathname(ae));
1150         assertEqualString("rdonly", archive_entry_fflags_text(ae));
1151         archive_entry_fflags(ae, &set, &clear);
1152 #if defined(__FreeBSD__)
1153         flag = UF_READONLY;
1154 #elif defined(_WIN32) && !defined(CYGWIN)
1155         flag = FILE_ATTRIBUTE_READONLY;
1156 #endif
1157         assertEqualInt(flag, set & flag);
1158
1159         assertA(0 == archive_read_next_header(a, &ae));
1160         assertEqualInt(archive_entry_mode(ae), 0755 | AE_IFDIR);
1161         assertEqualString("dir_hidden", archive_entry_pathname(ae));
1162         assertEqualString("hidden", archive_entry_fflags_text(ae));
1163         archive_entry_fflags(ae, &set, &clear);
1164 #if defined(__FreeBSD__)
1165         flag = UF_HIDDEN;
1166 #elif defined(_WIN32) && !defined(CYGWIN)
1167         flag = FILE_ATTRIBUTE_HIDDEN;
1168 #endif
1169         assertEqualInt(flag, set & flag);
1170
1171         assertA(0 == archive_read_next_header(a, &ae));
1172         assertEqualInt(archive_entry_mode(ae), 0755 | AE_IFDIR);
1173         assertEqualString("dir_system", archive_entry_pathname(ae));
1174         assertEqualString("system", archive_entry_fflags_text(ae));
1175         archive_entry_fflags(ae, &set, &clear);
1176 #if defined(__FreeBSD__)
1177         flag = UF_SYSTEM;
1178 #elif defined(_WIN32) && !defined(CYGWIN)
1179         flag = FILE_ATTRIBUTE_SYSTEM;
1180 #endif
1181         assertEqualInt(flag, set & flag);
1182
1183         assertA(0 == archive_read_next_header(a, &ae));
1184         assertEqualInt(archive_entry_mode(ae), 0555 | AE_IFDIR);
1185         assertEqualString("dir_rohidden", archive_entry_pathname(ae));
1186         assertEqualString("rdonly,hidden", archive_entry_fflags_text(ae));
1187         archive_entry_fflags(ae, &set, &clear);
1188 #if defined(__FreeBSD__)
1189         flag = UF_READONLY | UF_HIDDEN;
1190 #elif defined(_WIN32) && !defined(CYGWIN)
1191         flag = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN;
1192 #endif
1193         assertEqualInt(flag, set & flag);
1194
1195         EPILOGUE();
1196 }
1197
1198 DEFINE_TEST(test_read_format_rar5_different_window_size)
1199 {
1200         char buf[4096];
1201         PROLOGUE("test_read_format_rar5_different_window_size.rar");
1202
1203         /* Return codes of those calls are ignored, because this sample file
1204          * is invalid. However, the unpacker shouldn't produce any SIGSEGV
1205          * errors during processing. */
1206
1207         (void) archive_read_next_header(a, &ae);
1208         while(0 != archive_read_data(a, buf, sizeof(buf))) {}
1209
1210         (void) archive_read_next_header(a, &ae);
1211         while(0 != archive_read_data(a, buf, sizeof(buf))) {}
1212
1213         (void) archive_read_next_header(a, &ae);
1214         while(0 != archive_read_data(a, buf, sizeof(buf))) {}
1215
1216         EPILOGUE();
1217 }
1218
1219 DEFINE_TEST(test_read_format_rar5_arm_filter_on_window_boundary)
1220 {
1221         char buf[4096];
1222         PROLOGUE("test_read_format_rar5_arm_filter_on_window_boundary.rar");
1223
1224         /* Return codes of those calls are ignored, because this sample file
1225          * is invalid. However, the unpacker shouldn't produce any SIGSEGV
1226          * errors during processing. */
1227
1228         (void) archive_read_next_header(a, &ae);
1229         while(0 != archive_read_data(a, buf, sizeof(buf))) {}
1230
1231         EPILOGUE();
1232 }