Add a fuzzer for CPDF_ToUnicodeMap class.

Add a fuzzer to exercise the public methods of CPDF_ToUnicodeMap class.

Bug: chromium:1025443
Change-Id: If831e8db0cfc5007226b154a0164c026e1a5a7fa
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/83350
Commit-Queue: Hui Yingst <nigi@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/testing/fuzzers/BUILD.gn b/testing/fuzzers/BUILD.gn
index 0f88d23..e6a7bc3 100644
--- a/testing/fuzzers/BUILD.gn
+++ b/testing/fuzzers/BUILD.gn
@@ -68,7 +68,10 @@
 }
 if (is_clang) {
   # Fuzzers that use FuzzedDataProvider can only be built with Clang.
-  fuzzer_list += [ "pdf_nametree_fuzzer" ]
+  fuzzer_list += [
+    "pdf_cpdf_tounicodemap_fuzzer",
+    "pdf_nametree_fuzzer",
+  ]
 }
 
 # Note that this only compiles all the fuzzers, to prevent compile breakages.
@@ -435,6 +438,15 @@
 }
 
 if (is_clang) {
+  pdfium_fuzzer("pdf_cpdf_tounicodemap_fuzzer") {
+    sources = [ "pdf_cpdf_tounicodemap_fuzzer.cc" ]
+    deps = [
+      "../../core/fpdfapi/font",
+      "../../core/fpdfapi/parser",
+      "../../core/fxcrt",
+    ]
+  }
+
   pdfium_fuzzer("pdf_nametree_fuzzer") {
     sources = [ "pdf_nametree_fuzzer.cc" ]
     deps = [
diff --git a/testing/fuzzers/pdf_cpdf_tounicodemap_fuzzer.cc b/testing/fuzzers/pdf_cpdf_tounicodemap_fuzzer.cc
new file mode 100644
index 0000000..60ff1fc
--- /dev/null
+++ b/testing/fuzzers/pdf_cpdf_tounicodemap_fuzzer.cc
@@ -0,0 +1,37 @@
+// Copyright 2021 The PDFium 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 <fuzzer/FuzzedDataProvider.h>
+
+#include <memory>
+#include <vector>
+
+#include "core/fpdfapi/font/cpdf_tounicodemap.h"
+#include "core/fpdfapi/parser/cpdf_stream.h"
+#include "core/fxcrt/retain_ptr.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  static constexpr size_t kParameterSize = sizeof(uint32_t) + sizeof(wchar_t);
+  if (size <= kParameterSize)
+    return 0;
+
+  // Limit data size to prevent fuzzer timeout.
+  static constexpr size_t kMaxDataSize = 256 * 1024;
+  if (size > kParameterSize + kMaxDataSize)
+    return 0;
+
+  FuzzedDataProvider data_provider(data, size);
+  uint32_t charcode_to_lookup = data_provider.ConsumeIntegral<uint32_t>();
+  wchar_t char_for_reverse_lookup = data_provider.ConsumeIntegral<wchar_t>();
+
+  std::vector<uint8_t> remaining =
+      data_provider.ConsumeRemainingBytes<uint8_t>();
+  auto stream = pdfium::MakeRetain<CPDF_Stream>();
+  stream->SetData(remaining);
+
+  auto to_unicode_map = std::make_unique<CPDF_ToUnicodeMap>(stream.Get());
+  to_unicode_map->Lookup(charcode_to_lookup);
+  to_unicode_map->ReverseLookup(char_for_reverse_lookup);
+  return 0;
+}