/src/libvips/fuzz/generic_buffer_fuzzer.cc
Line | Count | Source |
1 | | #include "config.h" |
2 | | |
3 | | #include <vips/vips.h> |
4 | | |
5 | | /* |
6 | | #define DEBUG |
7 | | */ |
8 | | |
9 | | #ifndef SAVE_SUFFIX |
10 | | #define SAVE_SUFFIX ".jpg" |
11 | | #endif |
12 | | |
13 | | extern "C" int |
14 | | LLVMFuzzerInitialize(int *argc, char ***argv) |
15 | 37 | { |
16 | 37 | if (VIPS_INIT(*argv[0])) |
17 | 0 | return -1; |
18 | | |
19 | 37 | vips_concurrency_set(1); |
20 | | |
21 | | #ifdef DEBUG |
22 | | printf("available suffixes:\n"); |
23 | | GSList *suffixes = nullptr; |
24 | | char **array = vips_foreign_get_suffixes(); |
25 | | for (int i = 0; array[i] != nullptr; i++) { |
26 | | if (!g_slist_find_custom(suffixes, array[i], |
27 | | (GCompareFunc) g_strcmp0)) { |
28 | | printf("%s\n", array[i]); |
29 | | suffixes = g_slist_append(suffixes, g_strdup(array[i])); |
30 | | } |
31 | | |
32 | | g_free(array[i]); |
33 | | } |
34 | | g_free(array); |
35 | | g_slist_free_full(suffixes, g_free); |
36 | | #endif |
37 | | |
38 | 37 | return 0; |
39 | 37 | } |
40 | | |
41 | | extern "C" int |
42 | | LLVMFuzzerTestOneInput(const guint8 *data, size_t size) |
43 | 467k | { |
44 | 467k | VipsImage *image; |
45 | 467k | void *buf; |
46 | 467k | size_t len; |
47 | | |
48 | 467k | if (!(image = vips_image_new_from_buffer(data, size, "", nullptr))) |
49 | 153k | return 0; |
50 | | |
51 | 314k | if (image->Xsize > 100 || |
52 | 302k | image->Ysize > 100 || |
53 | 297k | image->Bands > 4) { |
54 | 17.1k | g_object_unref(image); |
55 | 17.1k | return 0; |
56 | 17.1k | } |
57 | | |
58 | 297k | if (vips_image_write_to_buffer(image, SAVE_SUFFIX, &buf, &len, nullptr)) { |
59 | 156k | g_object_unref(image); |
60 | 156k | return 0; |
61 | 156k | } |
62 | | |
63 | 141k | g_free(buf); |
64 | 141k | g_object_unref(image); |
65 | | |
66 | 141k | return 0; |
67 | 297k | } |