Merge "Add bspatch_fuzzer"
diff --git a/bsdiff.gyp b/bsdiff.gyp
index 318c344..65802f4 100644
--- a/bsdiff.gyp
+++ b/bsdiff.gyp
@@ -170,5 +170,21 @@
         },
       ],
     }],
+    # fuzzer target
+    ['USE_fuzzer == 1', {
+      'targets': [
+        {
+          'target_name': 'bspatch_fuzzer',
+          'type': 'executable',
+          'dependencies': [
+            'libbspatch-static',
+          ],
+          'includes': ['../../platform2/common-mk/common_fuzzer.gypi'],
+          'sources': [
+            'bspatch_fuzzer.cc',
+          ],
+        },
+      ],
+    }],
   ],
 }
diff --git a/bspatch_fuzzer.cc b/bspatch_fuzzer.cc
new file mode 100644
index 0000000..84409dd
--- /dev/null
+++ b/bspatch_fuzzer.cc
@@ -0,0 +1,38 @@
+// Copyright 2018 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <iostream>
+#include <memory>
+#include <vector>
+
+#include "bsdiff/bspatch.h"
+#include "bsdiff/memory_file.h"
+#include "bsdiff/sink_file.h"
+
+namespace {
+
+void FuzzBspatch(const uint8_t* data, size_t size) {
+  const size_t kBufferSize = 1024;
+  std::vector<uint8_t> source_buffer(kBufferSize);
+  std::unique_ptr<bsdiff::FileInterface> source(
+      new bsdiff::MemoryFile(source_buffer.data(), source_buffer.size()));
+  std::unique_ptr<bsdiff::FileInterface> target(new bsdiff::SinkFile(
+      [](const uint8_t* data, size_t size) { return size; }));
+  bsdiff::bspatch(source, target, data, size);
+}
+
+struct Environment {
+  Environment() {
+    // To turn off logging for bsdiff library.
+    std::cerr.setstate(std::ios_base::failbit);
+  }
+};
+
+}  // namespace
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  static Environment env;
+  FuzzBspatch(data, size);
+  return 0;
+}