]> granicus.if.org Git - imagemagick/commitdiff
add fuzzers from oss-fuzz
authorPaul Kehrer <paul.l.kehrer@gmail.com>
Mon, 8 Jan 2018 21:48:02 +0000 (16:48 -0500)
committerDirk Lemstra <dlemstra@users.noreply.github.com>
Mon, 8 Jan 2018 22:06:15 +0000 (23:06 +0100)
fuzz/crop_fuzzer.cc [new file with mode: 0644]
fuzz/encoder_fuzzer.cc [new file with mode: 0644]
fuzz/encoder_list.cc [new file with mode: 0644]
fuzz/enhance_fuzzer.cc [new file with mode: 0644]
fuzz/huffman_decode_fuzzer.cc [new file with mode: 0644]
fuzz/rotate_fuzzer.cc [new file with mode: 0644]

diff --git a/fuzz/crop_fuzzer.cc b/fuzz/crop_fuzzer.cc
new file mode 100644 (file)
index 0000000..afcebba
--- /dev/null
@@ -0,0 +1,24 @@
+#include <cstdint>
+
+#include <Magick++/Blob.h>
+#include <Magick++/Image.h>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
+  uint16_t Width;
+  uint16_t Height;
+  if (Size < (sizeof(Width) + sizeof(Height))) {
+    return 0;
+  }
+  Width = *reinterpret_cast<const uint16_t *>(Data);
+  Height = *reinterpret_cast<const uint16_t *>(Data + sizeof(Width));
+  const Magick::Blob blob(Data + sizeof(Width) + sizeof(Height),
+                          Size - (sizeof(Width) + sizeof(Height)));
+  Magick::Image image;
+  try {
+    image.read(blob);
+  } catch (Magick::Exception &e) {
+    return 0;
+  }
+  image.crop(Magick::Geometry(Width, Height));
+  return 0;
+}
diff --git a/fuzz/encoder_fuzzer.cc b/fuzz/encoder_fuzzer.cc
new file mode 100644 (file)
index 0000000..1bd601e
--- /dev/null
@@ -0,0 +1,24 @@
+#include <cstdint>
+
+#include <Magick++/Blob.h>
+#include <Magick++/Image.h>
+
+#define FUZZ_ENCODER_STRING_LITERAL(name) #name
+#define FUZZ_ENCODER FUZZ_ENCODER_STRING_LITERAL(FUZZ_IMAGEMAGICK_ENCODER)
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
+  const Magick::Blob blob(Data, Size);
+  Magick::Image image;
+  try {
+    image.read(blob);
+  } catch (Magick::Exception &e) {
+    return 0;
+  }
+
+  Magick::Blob outBlob;
+  try {
+    image.write(&outBlob, FUZZ_ENCODER);
+  } catch (Magick::Exception &e) {
+  }
+  return 0;
+}
diff --git a/fuzz/encoder_list.cc b/fuzz/encoder_list.cc
new file mode 100644 (file)
index 0000000..bf1a35f
--- /dev/null
@@ -0,0 +1,17 @@
+#include <iostream>
+
+#include <Magick++/Blob.h>
+#include <Magick++/Image.h>
+
+extern "C" int main() {
+  size_t nFormats;
+  Magick::ExceptionInfo ex;
+  const Magick::MagickInfo **formats = GetMagickInfoList("*", &nFormats, &ex);
+
+  for (size_t i = 0; i < nFormats; i++) {
+    const Magick::MagickInfo *format = formats[i];
+    if (format->encoder && format->name) {
+      std::cout << format->name << std::endl;
+    }
+  }
+}
diff --git a/fuzz/enhance_fuzzer.cc b/fuzz/enhance_fuzzer.cc
new file mode 100644 (file)
index 0000000..f508879
--- /dev/null
@@ -0,0 +1,16 @@
+#include <cstdint>
+
+#include <Magick++/Blob.h>
+#include <Magick++/Image.h>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
+  const Magick::Blob blob(Data, Size);
+  Magick::Image image;
+  try {
+    image.read(blob);
+    image.enhance();
+  } catch (Magick::Exception &e) {
+    return 0;
+  }
+  return 0;
+}
diff --git a/fuzz/huffman_decode_fuzzer.cc b/fuzz/huffman_decode_fuzzer.cc
new file mode 100644 (file)
index 0000000..2ad2575
--- /dev/null
@@ -0,0 +1,17 @@
+#include <cstdint>
+
+#include <Magick++/Blob.h>
+#include <Magick++/Image.h>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
+  const Magick::Blob blob(Data, Size);
+  Magick::Image image;
+  try {
+    image.read(blob);
+  } catch (Magick::Exception &e) {
+    return 0;
+  }
+  Magick::ExceptionInfo ex;
+  auto res = HuffmanDecodeImage(image.image(), &ex);
+  return 0;
+}
diff --git a/fuzz/rotate_fuzzer.cc b/fuzz/rotate_fuzzer.cc
new file mode 100644 (file)
index 0000000..774bf13
--- /dev/null
@@ -0,0 +1,23 @@
+#include <cstdint>
+
+#include <Magick++/Blob.h>
+#include <Magick++/Image.h>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
+  if (Size < sizeof(double)) {
+    return 0;
+  }
+  double Degrees = *reinterpret_cast<const double *>(Data);
+  if (!isfinite(Degrees)) {
+    return 0;
+  }
+  const Magick::Blob blob(Data + sizeof(Degrees), Size - sizeof(Degrees));
+  Magick::Image image;
+  try {
+    image.read(blob);
+  } catch (Magick::Exception &e) {
+    return 0;
+  }
+  image.rotate(Degrees);
+  return 0;
+}