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.