Changes for the Windows build to allow debugging of the oss-fuzz test cases.
authorDirk Lemstra <dirk@git.imagemagick.org>
Sat, 13 Jan 2018 18:03:20 +0000 (19:03 +0100)
committerDirk Lemstra <dirk@git.imagemagick.org>
Sat, 13 Jan 2018 18:03:38 +0000 (19:03 +0100)
Magick++/fuzz/encoder_format.h [new file with mode: 0644]
Magick++/fuzz/encoder_fuzzer.cc
Magick++/fuzz/main.cc [new file with mode: 0644]
Magick++/fuzz/utils.cc

diff --git a/Magick++/fuzz/encoder_format.h b/Magick++/fuzz/encoder_format.h
new file mode 100644 (file)
index 0000000..3f214b1
--- /dev/null
@@ -0,0 +1,11 @@
+class EncoderFormat {
+public:
+  std::string get() { return std::string(_format.begin(), _format.end()); } const
+  void set(const std::wstring format)
+  {
+    if (format.length() > 1)
+      _format = format.substr(1, format.size() - 1);
+  }
+private:
+  std::wstring _format = L".notset";
+};
\ No newline at end of file
index dc6b56caf257221335701962fc354400ed5798b2..2a2f49149d4d2ccb6bdaed196b30d2927570c206 100644 (file)
@@ -8,7 +8,9 @@
 static FuzzingResourceLimits kFuzzLimits;
 
 #define FUZZ_ENCODER_STRING_LITERAL(name) #name
+#ifndef FUZZ_ENCODER
 #define FUZZ_ENCODER FUZZ_ENCODER_STRING_LITERAL(FUZZ_IMAGEMAGICK_ENCODER)
+#endif
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
   const Magick::Blob blob(Data, Size);
@@ -17,14 +19,16 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
     image.magick(FUZZ_ENCODER);
     image.fileName(FUZZ_ENCODER + ':');
     image.read(blob);
-  } catch (Magick::Exception &e) {
+  }
+  catch (Magick::Exception &e) {
     return 0;
   }
 
   Magick::Blob outBlob;
   try {
     image.write(&outBlob, FUZZ_ENCODER);
-  } catch (Magick::Exception &e) {
+  }
+  catch (Magick::Exception &e) {
   }
   return 0;
 }
diff --git a/Magick++/fuzz/main.cc b/Magick++/fuzz/main.cc
new file mode 100644 (file)
index 0000000..293c20d
--- /dev/null
@@ -0,0 +1,88 @@
+#define WINVER 0x0501
+#define BUFSIZE 4096
+#pragma comment(lib, "Shlwapi.lib")
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include "Shlwapi.h"
+#include "encoder_format.h"
+using namespace std;
+
+extern EncoderFormat encoderFormat;
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
+
+class FuzzingDebugger
+{
+public:
+  bool load(wstring fileName);
+  void start();
+
+private:
+  char * _data;
+  size_t _size;
+};
+
+bool FuzzingDebugger::load(wstring fileName)
+{
+  ifstream
+    file;
+
+  streampos
+    size;
+
+  file = ifstream(fileName, ios::in | ios::binary | ios::ate);
+  if (!file.is_open())
+    return(false);
+
+  size = file.tellg();
+  _size = size;
+  _data = new char[_size];
+  file.seekg(0, ios::beg);
+  file.read(_data, size);
+  file.close();
+
+  encoderFormat.set(wstring(PathFindExtension(fileName.c_str())));
+
+  return(true);
+}
+
+void FuzzingDebugger::start()
+{
+  const uint8_t
+    *data;
+
+  data = reinterpret_cast<const uint8_t *>(_data);
+  LLVMFuzzerTestOneInput(data, _size);
+}
+
+int wmain(int argc, wchar_t *argv[])
+{
+  FuzzingDebugger
+    debugger;
+
+  wstring
+    fileName;
+
+  if (argc == 1)
+  {
+    wchar_t
+      fullPath[BUFSIZE],
+      **lppPart;
+
+    lppPart = NULL;
+    GetFullPathName(argv[0], BUFSIZE, fullPath, lppPart);
+    PathRemoveExtension(fullPath);
+    fileName = wstring(fullPath) + L".input";
+  }
+  else
+    fileName = wstring(argv[1]);
+
+  if (!debugger.load(fileName))
+  {
+    wcerr << L"Unable to load " << fileName;
+    cin.get();
+  }
+  else
+    debugger.start();
+}
\ No newline at end of file
index cd6e52a1035c8fbf1d26acafe37788696d925b35..3a80b576815c7b270218f724a84dc5ff6acb2937 100644 (file)
@@ -1,9 +1,16 @@
 #include <Magick++/ResourceLimits.h>
 
-
 class FuzzingResourceLimits {
 public:
     FuzzingResourceLimits() {
         Magick::ResourceLimits::memory(1000000000);
     }
 };
+
+#if BUILD_MAIN
+#include "encoder_format.h"
+
+EncoderFormat encoderFormat;
+
+#define FUZZ_ENCODER encoderFormat.get()
+#endif // BUILD_MAIN