1 #include <cstdint>
2 #include <cstring>
3
4 #include <Magick++/Blob.h>
5 #include <Magick++/Image.h>
6
7 #include "utils.cc"
8
9 #define FUZZ_ENCODER_STRING_LITERAL_X(name) FUZZ_ENCODER_STRING_LITERAL(name)
10 #define FUZZ_ENCODER_STRING_LITERAL(name) #name
11
12 #ifndef FUZZ_ENCODER
13 #define FUZZ_ENCODER FUZZ_ENCODER_STRING_LITERAL_X(FUZZ_IMAGEMAGICK_ENCODER)
14 #endif
15
16 #ifndef FUZZ_IMAGEMAGICK_INITIALIZER
17 #define FUZZ_IMAGEMAGICK_INITIALIZER ""
18 #endif
19 #define FUZZ_ENCODER_INITIALIZER FUZZ_ENCODER_STRING_LITERAL_X(FUZZ_IMAGEMAGICK_INITIALIZER)
20
EncoderInitializer(const uint8_t * Data,const size_t Size,Magick::Image & image)21 static ssize_t EncoderInitializer(const uint8_t *Data, const size_t Size, Magick::Image &image)
22 {
23 if (strcmp(FUZZ_ENCODER_INITIALIZER, "interlace") == 0) {
24 Magick::InterlaceType interlace = (Magick::InterlaceType) *reinterpret_cast<const char *>(Data);
25 if (interlace > Magick::PNGInterlace)
26 return -1;
27 image.interlaceType(interlace);
28 return 1;
29 }
30
31 return 0;
32 }
33
LLVMFuzzerTestOneInput(const uint8_t * Data,size_t Size)34 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
35 Magick::Image image;
36 const ssize_t offset = EncoderInitializer(Data, Size, image);
37 if (offset < 0)
38 return 0;
39 std::string encoder = FUZZ_ENCODER;
40 image.magick(encoder);
41 image.fileName(std::string(encoder) + ":");
42 const Magick::Blob blob(Data + offset, Size - offset);
43 try {
44 image.ping(blob);
45 }
46 catch (Magick::Exception &e) {
47 return 0;
48 }
49 return 0;
50 }
51
52 #include "travis.cc"
53