• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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