Merge duplicate CPDF_CrossRefTable creation code
In CPDF_Parser::LoadCrossRefV5(), two code paths have the same code for
creating CPDF_CrossRefTable. Merge them into one ctor call and then
std::move() it as needed. Also remove the need for 2 pointers to the
same stream object in LoadCrossRefV5().
Change-Id: I1505f0120db8de5660424ab2d29bb56ffbbb5c4e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/112931
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index b7bfed0..6aef205 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -749,13 +749,11 @@
}
bool CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, bool bMainXRef) {
- RetainPtr<CPDF_Object> pObject(ParseIndirectObjectAt(*pos, 0));
- if (!pObject || !pObject->GetObjNum())
+ RetainPtr<const CPDF_Stream> pStream =
+ ToStream(ParseIndirectObjectAt(*pos, 0));
+ if (!pStream || !pStream->GetObjNum()) {
return false;
-
- RetainPtr<const CPDF_Stream> pStream(pObject->AsStream());
- if (!pStream)
- return false;
+ }
RetainPtr<const CPDF_Dictionary> pDict = pStream->GetDict();
int32_t prev = pDict->GetIntegerFor("Prev");
@@ -768,16 +766,15 @@
*pos = prev;
- RetainPtr<CPDF_Dictionary> pNewTrailer = ToDictionary(pDict->Clone());
+ auto new_cross_ref_table = std::make_unique<CPDF_CrossRefTable>(
+ /*trailer=*/ToDictionary(pDict->Clone()),
+ /*trailer_object_number=*/pStream->GetObjNum());
if (bMainXRef) {
- m_CrossRefTable = std::make_unique<CPDF_CrossRefTable>(
- std::move(pNewTrailer), pStream->GetObjNum());
+ m_CrossRefTable = std::move(new_cross_ref_table);
m_CrossRefTable->SetObjectMapSize(size);
} else {
m_CrossRefTable = CPDF_CrossRefTable::MergeUp(
- std::make_unique<CPDF_CrossRefTable>(std::move(pNewTrailer),
- pStream->GetObjNum()),
- std::move(m_CrossRefTable));
+ std::move(new_cross_ref_table), std::move(m_CrossRefTable));
}
std::vector<CrossRefV5IndexEntry> indices =
@@ -795,7 +792,7 @@
return false;
uint32_t total_width = dwAccWidth.ValueOrDie();
- auto pAcc = pdfium::MakeRetain<CPDF_StreamAcc>(std::move(pStream));
+ auto pAcc = pdfium::MakeRetain<CPDF_StreamAcc>(pStream);
pAcc->LoadAllDataFiltered();
pdfium::span<const uint8_t> data_span = pAcc->GetSpan();