Pass span<> to CPDF_StreamContentParser::Parse()
Then use subspan() operation in place of size arithmethic.
Change-Id: Ib2cc230e922ec35245b296db69a2370df5a4002a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/81413
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp
index 6ffce1d..823a0fc 100644
--- a/core/fpdfapi/page/cpdf_contentparser.cpp
+++ b/core/fpdfapi/page/cpdf_contentparser.cpp
@@ -200,7 +200,7 @@
m_StreamSegmentOffsets.push_back(0);
static constexpr uint32_t kParseStepLimit = 100;
- m_CurrentOffset += m_pParser->Parse(m_pData.Get(), m_Size, m_CurrentOffset,
+ m_CurrentOffset += m_pParser->Parse({m_pData.Get(), m_Size}, m_CurrentOffset,
kParseStepLimit, m_StreamSegmentOffsets);
return Stage::kParse;
}
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index a28a922..4cb27e6 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -1492,34 +1492,29 @@
}
uint32_t CPDF_StreamContentParser::Parse(
- const uint8_t* pData,
- uint32_t dwSize,
+ pdfium::span<const uint8_t> pData,
uint32_t start_offset,
uint32_t max_cost,
const std::vector<uint32_t>& stream_start_offsets) {
- DCHECK(start_offset < dwSize);
+ DCHECK(start_offset < pData.size());
- // Parsing will be done from |pDataStart|, for at most |size_left| bytes.
- const uint8_t* pDataStart = pData + start_offset;
- uint32_t size_left = dwSize - start_offset;
-
+ // Parsing will be done from within |pDataStart|.
+ pdfium::span<const uint8_t> pDataStart = pData.subspan(start_offset);
m_StartParseOffset = start_offset;
-
if (m_ParsedSet->size() > kMaxFormLevel ||
- pdfium::Contains(*m_ParsedSet, pDataStart)) {
- return size_left;
+ pdfium::Contains(*m_ParsedSet, pDataStart.data())) {
+ return pDataStart.size();
}
m_StreamStartOffsets = stream_start_offsets;
ScopedSetInsertion<const uint8_t*> scopedInsert(m_ParsedSet.Get(),
- pDataStart);
+ pDataStart.data());
uint32_t init_obj_count = m_pObjectHolder->GetPageObjectCount();
AutoNuller<std::unique_ptr<CPDF_StreamParser>> auto_clearer(&m_pSyntax);
m_pSyntax = std::make_unique<CPDF_StreamParser>(
- pdfium::make_span(pDataStart, size_left),
- m_pDocument->GetByteStringPool());
+ pDataStart, m_pDocument->GetByteStringPool());
while (1) {
uint32_t cost = m_pObjectHolder->GetPageObjectCount() - init_obj_count;
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.h b/core/fpdfapi/page/cpdf_streamcontentparser.h
index 343faf5..008c12a 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.h
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.h
@@ -20,6 +20,7 @@
#include "core/fxcrt/unowned_ptr.h"
#include "core/fxge/cfx_fillrenderoptions.h"
#include "core/fxge/cfx_pathdata.h"
+#include "third_party/base/span.h"
class CPDF_AllStates;
class CPDF_ColorSpace;
@@ -50,8 +51,7 @@
std::set<const uint8_t*>* pParsedSet);
~CPDF_StreamContentParser();
- uint32_t Parse(const uint8_t* pData,
- uint32_t dwSize,
+ uint32_t Parse(pdfium::span<const uint8_t> pData,
uint32_t start_offset,
uint32_t max_cost,
const std::vector<uint32_t>& stream_start_offsets);