Set up DiscardableMemoryAllocator for pdfium fuzzer

Sets up DiscardableMemoryAllocator for pdfium fuzzer when fuzzer is
built and run from Chromium.

Bug: chromium:1433189
Change-Id: Ief43a9151885a42890fa3e6f5046ccf0745ed0cc
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/106270
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Nigi <nigi@chromium.org>
diff --git a/testing/fuzzers/BUILD.gn b/testing/fuzzers/BUILD.gn
index 9667ba1..6924558 100644
--- a/testing/fuzzers/BUILD.gn
+++ b/testing/fuzzers/BUILD.gn
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build_overrides/build.gni")
 import("../../pdfium.gni")
 
 config("fuzzer_config") {
@@ -149,6 +150,7 @@
 
 if (is_component_build) {
   group("fuzzer_impls") {
+    testonly = true
     deps = []
     foreach(fuzzer, fuzzer_list) {
       deps += [ ":${fuzzer}_impl" ]
@@ -218,6 +220,7 @@
     impl_name = target_name + "_src"
   }
   source_set(impl_name) {
+    testonly = true
     sources = invoker.sources
     deps = []
     if (defined(invoker.deps)) {
@@ -613,5 +616,11 @@
 pdfium_fuzzer("pdfium_fuzzer") {
   sources = [ "pdfium_fuzzer.cc" ]
   deps = [ ":fuzzer_helper" ]
+  if (build_with_chromium) {
+    deps += [
+      "//base",
+      "//base/test:test_support",
+    ]
+  }
   public_fuzzer = true
 }
diff --git a/testing/fuzzers/DEPS b/testing/fuzzers/DEPS
index fe9eaf6..d577044 100644
--- a/testing/fuzzers/DEPS
+++ b/testing/fuzzers/DEPS
@@ -1,4 +1,7 @@
 include_rules = [
   '+fxbarcode',
   '+xfa',
+
+  # Only used when the fuzzer is embedded in Chromium.
+  '+base',
 ]
diff --git a/testing/fuzzers/pdfium_fuzzer.cc b/testing/fuzzers/pdfium_fuzzer.cc
index e70702a..7e25fed 100644
--- a/testing/fuzzers/pdfium_fuzzer.cc
+++ b/testing/fuzzers/pdfium_fuzzer.cc
@@ -6,6 +6,12 @@
 
 #include "testing/fuzzers/pdfium_fuzzer_helper.h"
 
+#if defined(BUILD_WITH_CHROMIUM)
+#include "base/memory/discardable_memory_allocator.h"
+#include "base/no_destructor.h"
+#include "base/test/test_discardable_memory_allocator.h"
+#endif
+
 class PDFiumFuzzer : public PDFiumFuzzerHelper {
  public:
   PDFiumFuzzer() = default;
@@ -15,6 +21,12 @@
 };
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+#if defined(BUILD_WITH_CHROMIUM)
+  static base::NoDestructor<base::TestDiscardableMemoryAllocator>
+      test_memory_allocator;
+  base::DiscardableMemoryAllocator::SetInstance(test_memory_allocator.get());
+#endif
+
   PDFiumFuzzer fuzzer;
   fuzzer.RenderPdf(reinterpret_cast<const char*>(data), size);
   return 0;