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