]> wimlib.net Git - wimlib/blob - tools/afl-fuzz/compress/fuzz.c
tools/afl-fuzz: fix ctype calculation
[wimlib] / tools / afl-fuzz / compress / fuzz.c
1 #include <assert.h>
2 #include <fcntl.h>
3 #include <inttypes.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <sys/stat.h>
7 #include <unistd.h>
8 #include <wimlib.h>
9
10 int main(int argc, char *argv[])
11 {
12         int fd;
13         struct stat stbuf;
14         uint8_t ctype;
15         uint8_t level;
16         struct wimlib_compressor *c;
17         struct wimlib_decompressor *d;
18         size_t usize, csize;
19         void *udata, *cdata, *decompressed;
20         int ret;
21
22         fd = open(argv[1], O_RDONLY);
23         assert(fd >= 0);
24         ret = fstat(fd, &stbuf);
25         assert(!ret);
26
27         if (stbuf.st_size < 2)
28                 return 0;
29         ret = read(fd, &ctype, 1);
30         assert(ret == 1);
31         ret = read(fd, &level, 1);
32         assert(ret == 1);
33         ctype = 1 + ((uint8_t)(ctype - 1) % 3); /* 1-3 */
34         level = 1 + (level % 100); /* 1-100 */
35         usize = stbuf.st_size - 2;
36
37         udata = malloc(usize);
38         cdata = malloc(usize);
39         decompressed = malloc(usize);
40
41         ret = read(fd, udata, usize);
42         assert(ret == usize);
43
44         ret = wimlib_create_compressor(ctype, usize, level, &c);
45         if (ret == 0) {
46                 ret = wimlib_create_decompressor(ctype, usize, &d);
47                 assert(ret == 0);
48
49                 csize = wimlib_compress(udata, usize, cdata, usize, c);
50                 if (csize) {
51                         ret = wimlib_decompress(cdata, csize,
52                                                 decompressed, usize, d);
53                         assert(ret == 0);
54                         assert(memcmp(udata, decompressed, usize) == 0);
55                 }
56                 wimlib_free_compressor(c);
57                 wimlib_free_decompressor(d);
58         }
59         free(udata);
60         free(cdata);
61         free(decompressed);
62         return 0;
63 }