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();