/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 | 5.19k | { |
15 | 5.19k | if(size > data_max) return 0; |
16 | | |
17 | 5.19k | int ret = 0; |
18 | 5.19k | mz_zip_archive zip; |
19 | 5.19k | mz_zip_zero_struct(&zip); |
20 | | |
21 | 5.19k | mz_uint flags = 0; |
22 | | |
23 | 5.19k | if(!mz_zip_reader_init_mem(&zip, data, size, flags)) return 0; |
24 | | |
25 | 3.94k | mz_uint i, files; |
26 | | |
27 | 3.94k | files = mz_zip_reader_get_num_files(&zip); |
28 | | |
29 | 40.9k | for(i=0; i < files; i++) |
30 | 36.9k | { |
31 | 36.9k | mz_zip_clear_last_error(&zip); |
32 | | |
33 | 36.9k | if(mz_zip_reader_is_file_a_directory(&zip, i)) continue; |
34 | | |
35 | 35.2k | mz_zip_validate_file(&zip, i, MZ_ZIP_FLAG_VALIDATE_HEADERS_ONLY); |
36 | | |
37 | 35.2k | if(mz_zip_reader_is_file_encrypted(&zip, i)) continue; |
38 | | |
39 | 33.4k | mz_zip_clear_last_error(&zip); |
40 | | |
41 | 33.4k | mz_uint ret = mz_zip_reader_get_filename(&zip, i, filename, filename_max); |
42 | | |
43 | 33.4k | if(mz_zip_get_last_error(&zip)) continue; |
44 | | |
45 | 33.4k | mz_zip_archive_file_stat file_stat = {0}; |
46 | 33.4k | mz_bool status = mz_zip_reader_file_stat(&zip, i, &file_stat) != 0; |
47 | | |
48 | 33.4k | if ((file_stat.m_method) && (file_stat.m_method != MZ_DEFLATED)) continue; |
49 | | |
50 | 30.8k | mz_zip_reader_extract_file_to_mem(&zip, file_stat.m_filename, read_buf, read_buf_size, 0); |
51 | 30.8k | } |
52 | | |
53 | 3.94k | cleanup: |
54 | 3.94k | mz_zip_reader_end(&zip); |
55 | | |
56 | 3.94k | return ret; |
57 | 3.94k | } |