/src/libvips/fuzz/jpegsave_file_fuzzer.cc
Line | Count | Source (jump to first uncovered line) |
1 | | #include <vips/vips.h> |
2 | | |
3 | | extern "C" int |
4 | | LLVMFuzzerInitialize(int *argc, char ***argv) |
5 | 33 | { |
6 | 33 | if (VIPS_INIT(*argv[0])) |
7 | 0 | return -1; |
8 | | |
9 | 33 | vips_concurrency_set(1); |
10 | 33 | return 0; |
11 | 33 | } |
12 | | |
13 | | static int |
14 | | test_one_file(const char *name) |
15 | 33.1k | { |
16 | 33.1k | VipsImage *image; |
17 | 33.1k | void *buf; |
18 | 33.1k | size_t len; |
19 | | |
20 | 33.1k | if (!(image = vips_image_new_from_file(name, |
21 | 33.1k | "access", VIPS_ACCESS_SEQUENTIAL, |
22 | 33.1k | nullptr))) |
23 | 10.9k | return 0; |
24 | | |
25 | 22.1k | if (image->Xsize > 100 || |
26 | 22.1k | image->Ysize > 100 || |
27 | 22.1k | image->Bands > 4) { |
28 | 1.10k | g_object_unref(image); |
29 | 1.10k | return 0; |
30 | 1.10k | } |
31 | | |
32 | 21.0k | if (vips_jpegsave_buffer(image, &buf, &len, nullptr)) { |
33 | 12.7k | g_object_unref(image); |
34 | 12.7k | return 0; |
35 | 12.7k | } |
36 | | |
37 | 8.35k | g_free(buf); |
38 | 8.35k | g_object_unref(image); |
39 | | |
40 | 8.35k | return 0; |
41 | 21.0k | } |
42 | | |
43 | | extern "C" int |
44 | | LLVMFuzzerTestOneInput(const guint8 *data, size_t size) |
45 | 33.1k | { |
46 | 33.1k | char *name; |
47 | | |
48 | 33.1k | if (!(name = vips__temp_name("%s"))) |
49 | 0 | return 0; |
50 | | |
51 | 33.1k | if (!g_file_set_contents(name, (const char *) data, size, nullptr) || |
52 | 33.1k | test_one_file(name)) { |
53 | 0 | g_unlink(name); |
54 | 0 | g_free(name); |
55 | |
|
56 | 0 | return 0; |
57 | 0 | } |
58 | | |
59 | 33.1k | g_unlink(name); |
60 | 33.1k | g_free(name); |
61 | | |
62 | 33.1k | return 0; |
63 | 33.1k | } |