/src/miniz/tests/zip_fuzzer.c
Line | Count | Source (jump to first uncovered line) |
1 | | #include <stdint.h> |
2 | | #include <inttypes.h> |
3 | | |
4 | | #include "miniz.h" |
5 | | |
6 | | static char filename[260]; |
7 | | static unsigned char read_buf[1024 * 256]; |
8 | | |
9 | | static const size_t filename_max = sizeof(filename); |
10 | | static const size_t read_buf_size = sizeof(read_buf); |
11 | | static const size_t data_max = 1024 * 256; |
12 | | |
13 | | int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) |
14 | 4.50k | { |
15 | 4.50k | if (size > data_max) |
16 | 4 | return 0; |
17 | | |
18 | 4.49k | int ret = 0; |
19 | 4.49k | mz_zip_archive zip; |
20 | 4.49k | mz_zip_zero_struct(&zip); |
21 | | |
22 | 4.49k | mz_uint flags = 0; |
23 | | |
24 | 4.49k | if (!mz_zip_reader_init_mem(&zip, data, size, flags)) |
25 | 1.02k | return 0; |
26 | | |
27 | 3.47k | mz_uint i, files; |
28 | | |
29 | 3.47k | files = mz_zip_reader_get_num_files(&zip); |
30 | | |
31 | 39.8k | for (i = 0; i < files; i++) |
32 | 36.3k | { |
33 | 36.3k | mz_zip_clear_last_error(&zip); |
34 | | |
35 | 36.3k | if (mz_zip_reader_is_file_a_directory(&zip, i)) |
36 | 2.51k | continue; |
37 | | |
38 | 33.8k | mz_zip_validate_file(&zip, i, MZ_ZIP_FLAG_VALIDATE_HEADERS_ONLY); |
39 | | |
40 | 33.8k | if (mz_zip_reader_is_file_encrypted(&zip, i)) |
41 | 2.50k | continue; |
42 | | |
43 | 31.3k | mz_zip_clear_last_error(&zip); |
44 | | |
45 | 31.3k | mz_uint ret = mz_zip_reader_get_filename(&zip, i, filename, filename_max); |
46 | | |
47 | 31.3k | if (mz_zip_get_last_error(&zip)) |
48 | 0 | continue; |
49 | | |
50 | 31.3k | mz_zip_archive_file_stat file_stat = { 0 }; |
51 | 31.3k | mz_bool status = mz_zip_reader_file_stat(&zip, i, &file_stat) != 0; |
52 | | |
53 | 31.3k | if ((file_stat.m_method) && (file_stat.m_method != MZ_DEFLATED)) |
54 | 4.05k | continue; |
55 | | |
56 | 27.3k | mz_zip_reader_extract_file_to_mem(&zip, file_stat.m_filename, read_buf, read_buf_size, 0); |
57 | 27.3k | } |
58 | | |
59 | 3.47k | cleanup: |
60 | 3.47k | mz_zip_reader_end(&zip); |
61 | | |
62 | 3.47k | return ret; |
63 | 3.47k | } |