blob: 5edcdbb6fab47ac7b3040c35ebd3ae3d99bde2a2 (
plain)
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
66
67
68
|
#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"
|