Use FixedTryAllocZeroedDataVector in CPDF_ContentParser.

Replace std::unique_ptr and FX_TryAlloc() with
FixedTryAllocZeroedDataVector.

Bug: pdfium:1872
Change-Id: Id3631c522a8612a498b3c774ee617db939483f4e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/100572
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp
index 6ae8bab..5ef9d80 100644
--- a/core/fpdfapi/page/cpdf_contentparser.cpp
+++ b/core/fpdfapi/page/cpdf_contentparser.cpp
@@ -18,6 +18,7 @@
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_stream.h"
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
+#include "core/fxcrt/fixed_try_alloc_zeroed_data_vector.h"
 #include "core/fxcrt/fx_safe_types.h"
 #include "core/fxcrt/pauseindicator_iface.h"
 #include "core/fxcrt/span_util.h"
@@ -26,13 +27,6 @@
 #include "third_party/base/check.h"
 #include "third_party/base/check_op.h"
 
-CPDF_ContentParser::OwnedData::OwnedData(
-    std::unique_ptr<uint8_t, FxFreeDeleter> buffer,
-    uint32_t size)
-    : buffer(std::move(buffer)), size(size) {}
-
-CPDF_ContentParser::OwnedData::~OwnedData() = default;
-
 CPDF_ContentParser::CPDF_ContentParser(CPDF_Page* pPage)
     : m_CurrentStage(Stage::kGetContent), m_pPageObjectHolder(pPage) {
   DCHECK(pPage);
@@ -183,22 +177,21 @@
   }
 
   const size_t buffer_size = safe_size.ValueOrDie();
-  std::unique_ptr<uint8_t, FxFreeDeleter> buffer(
-      FX_TryAlloc(uint8_t, buffer_size));
-  if (!buffer) {
+  FixedTryAllocZeroedDataVector<uint8_t> buffer(buffer_size);
+  if (buffer.empty()) {
     m_Data.emplace<pdfium::span<const uint8_t>>();
     return Stage::kComplete;
   }
 
   size_t pos = 0;
-  auto data_span = pdfium::make_span(buffer.get(), buffer_size);
+  auto data_span = buffer.writable_span();
   for (const auto& stream : m_StreamArray) {
     fxcrt::spancpy(data_span.subspan(pos), stream->GetSpan());
     pos += stream->GetSize();
     data_span[pos++] = ' ';
   }
   m_StreamArray.clear();
-  m_Data.emplace<OwnedData>(std::move(buffer), buffer_size);
+  m_Data = std::move(buffer);
   return Stage::kParse;
 }
 
@@ -272,9 +265,7 @@
 }
 
 pdfium::span<const uint8_t> CPDF_ContentParser::GetData() const {
-  if (is_owned()) {
-    const OwnedData& data = absl::get<OwnedData>(m_Data);
-    return pdfium::make_span(data.buffer.get(), data.size);
-  }
+  if (is_owned())
+    return absl::get<FixedTryAllocZeroedDataVector<uint8_t>>(m_Data).span();
   return absl::get<pdfium::span<const uint8_t>>(m_Data);
 }
diff --git a/core/fpdfapi/page/cpdf_contentparser.h b/core/fpdfapi/page/cpdf_contentparser.h
index 09c8586..34006c7 100644
--- a/core/fpdfapi/page/cpdf_contentparser.h
+++ b/core/fpdfapi/page/cpdf_contentparser.h
@@ -14,7 +14,7 @@
 #include <vector>
 
 #include "core/fpdfapi/page/cpdf_streamcontentparser.h"
-#include "core/fxcrt/fx_memory_wrappers.h"
+#include "core/fxcrt/fixed_try_alloc_zeroed_data_vector.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/unowned_ptr.h"
 #include "third_party/abseil-cpp/absl/types/variant.h"
@@ -54,16 +54,6 @@
     kComplete,
   };
 
-  // TODO(thestig): Evaluate fxcrt::MaybeOwned usage, and see if that can be
-  // replaced with absl::variant<pdfium::span<const uint8_t>, OwnedData>.
-  struct OwnedData {
-    OwnedData(std::unique_ptr<uint8_t, FxFreeDeleter> buffer, uint32_t size);
-    ~OwnedData();
-
-    std::unique_ptr<uint8_t, FxFreeDeleter> buffer;
-    uint32_t size;
-  };
-
   Stage GetContent();
   Stage PrepareContent();
   Stage Parse();
@@ -82,7 +72,9 @@
   RetainPtr<CPDF_StreamAcc> m_pSingleStream;
   std::vector<RetainPtr<CPDF_StreamAcc>> m_StreamArray;
   std::vector<uint32_t> m_StreamSegmentOffsets;
-  absl::variant<pdfium::span<const uint8_t>, OwnedData> m_Data;
+  absl::variant<pdfium::span<const uint8_t>,
+                FixedTryAllocZeroedDataVector<uint8_t>>
+      m_Data;
   uint32_t m_nStreams = 0;
   uint32_t m_CurrentOffset = 0;
   std::set<const uint8_t*> m_ParsedSet;  // Only used when parsing pages.