blob: 5edcdbb6fab47ac7b3040c35ebd3ae3d99bde2a2 [file] [log] [blame]
#include <cstdint>
#include <string.h>
#include <Magick++/Blob.h>
#include <Magick++/Image.h>
#include "utils.cc"
#define FUZZ_ENCODER_STRING_LITERAL_X(name) FUZZ_ENCODER_STRING_LITERAL(name)
#define FUZZ_ENCODER_STRING_LITERAL(name) #name
#ifndef FUZZ_ENCODER
#define FUZZ_ENCODER FUZZ_ENCODER_STRING_LITERAL_X(FUZZ_IMAGEMAGICK_ENCODER)
#endif
#ifndef FUZZ_IMAGEMAGICK_INITIALIZER
#define FUZZ_IMAGEMAGICK_INITIALIZER ""
#endif
#define FUZZ_ENCODER_INITIALIZER FUZZ_ENCODER_STRING_LITERAL_X(FUZZ_IMAGEMAGICK_INITIALIZER)
static ssize_t EncoderInitializer(const uint8_t *Data, const size_t Size, Magick::Image &image)
{
if (strcmp(FUZZ_ENCODER_INITIALIZER, "interlace") == 0) {
Magick::InterlaceType interlace = (Magick::InterlaceType) *reinterpret_cast<const char *>(Data);
if (interlace > Magick::PNGInterlace)
return -1;
image.interlaceType(interlace);
return 1;
}
if (strcmp(FUZZ_ENCODER_INITIALIZER, "png") == 0) {
image.defineValue("png", "ignore-crc", "1");
}
return 0;
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
{
if (Size < 1)
return 0;
Magick::Image image;
const ssize_t offset = EncoderInitializer(Data, Size, image);
if (offset < 0)
return 0;
std::string encoder = FUZZ_ENCODER;
image.magick(encoder);
image.fileName(std::string(encoder) + ":");
const Magick::Blob blob(Data + offset, Size - offset);
try {
image.read(blob);
}
catch (Magick::Exception &e) {
return 0;
}
#if FUZZ_IMAGEMAGICK_ENCODER_WRITE || BUILD_MAIN
Magick::Blob outBlob;
try {
image.write(&outBlob, encoder);
}
catch (Magick::Exception &e) {
}
#endif
return 0;
}
#include "travis.cc"