Fix one more edited PDF regression

Restore some of the CPDF_Parser::LoadAllSecondaryCrossRefStreams() logic
that https://pdfium-review.googlesource.com/118571 deleted. Since the
CPDF_Parser code changed quite a bit, incorporate that logic into
FindAllCrossReferenceTablesAndStream().

With this fix in place, unsuppress the bug_2152.pdf pixel test.

Bug: pdfium:2152
Change-Id: Ie4cf79cddca6e0f1f4a331ceea5676f62c7d4a6e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/118756
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index c040bdd..7472907 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -676,25 +676,40 @@
     }
 
     seen_xref_offset.insert(xref_offset);
-    xref_list.insert(xref_list.begin(), xref_offset);
 
-    // SLOW ...
-    LoadCrossRefTable(xref_offset, /*skip=*/true);
+    // Use a copy of `xref_offset`, as LoadCrossRefStream() may change it.
+    FX_FILESIZE xref_offset_copy = xref_offset;
+    if (LoadCrossRefStream(&xref_offset_copy, /*is_main_xref=*/false)) {
+      // Since `xref_offset` points to a cross reference stream, mark it
+      // accordingly.
+      xref_list.insert(xref_list.begin(), 0);
+      xref_stream_list.insert(xref_stream_list.begin(), xref_offset);
+      xref_offset = xref_offset_copy;
 
-    RetainPtr<CPDF_Dictionary> trailer_dict = LoadTrailer();
-    if (!trailer_dict) {
-      return false;
+      // On success, LoadCrossRefStream() called CPDF_CrossRefTable::MergeUp()
+      // when `is_main_xref` is false. Thus no explicit call here.
+    } else {
+      // SLOW ...
+      LoadCrossRefTable(xref_offset, /*skip=*/true);
+
+      RetainPtr<CPDF_Dictionary> trailer_dict = LoadTrailer();
+      if (!trailer_dict) {
+        return false;
+      }
+
+      // The trailer for cross reference tables may point to a cross reference
+      // stream as well.
+      xref_list.insert(xref_list.begin(), xref_offset);
+      xref_stream_list.insert(xref_stream_list.begin(),
+                              trailer_dict->GetIntegerFor("XRefStm"));
+      xref_offset = trailer_dict->GetDirectIntegerFor("Prev");
+
+      // SLOW ...
+      m_CrossRefTable = CPDF_CrossRefTable::MergeUp(
+          std::make_unique<CPDF_CrossRefTable>(std::move(trailer_dict),
+                                               kNoTrailerObjectNumber),
+          std::move(m_CrossRefTable));
     }
-
-    xref_offset = trailer_dict->GetDirectIntegerFor("Prev");
-    xref_stream_list.insert(xref_stream_list.begin(),
-                            trailer_dict->GetIntegerFor("XRefStm"));
-
-    // SLOW ...
-    m_CrossRefTable = CPDF_CrossRefTable::MergeUp(
-        std::make_unique<CPDF_CrossRefTable>(std::move(trailer_dict),
-                                             kNoTrailerObjectNumber),
-        std::move(m_CrossRefTable));
   }
   return true;
 }
diff --git a/testing/SUPPRESSIONS b/testing/SUPPRESSIONS
index 5576a87..96c84d12 100644
--- a/testing/SUPPRESSIONS
+++ b/testing/SUPPRESSIONS
@@ -659,9 +659,6 @@
 # TODO(pdfium:2001): Remove after associated bug is fixed
 bug_2001.pdf * * * *
 
-# TODO(pdfium:2152): Remove after associated bug is fixed
-bug_2152.pdf * * * *
-
 # TODO(chromium:237527): Remove after associated bug is fixed
 bug_237527_1.in * * * *