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