Remove limit on number of form XObjects within a form XObject Recent bugs reports showed that this limit is being reached in legitimate real-world PDFs. Favor rendering these correctly over trying to stop PDFs that intentionally use up resources. As such, this CL effectively revert CLs [1] and [2] to restore the prior behavior. The malicious PDF can be dealt with later via some other means. [1] https://pdfium-review.googlesource.com/108333 [2] https://pdfium-review.googlesource.com/115670 Bug: chromium:1519494,pdfium:1815 Change-Id: I5209a98817431ed12c31a0638000219074d0f9bf Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/116132 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp index f1bb8a9..dce0dc5 100644 --- a/core/fpdfapi/page/cpdf_contentparser.cpp +++ b/core/fpdfapi/page/cpdf_contentparser.cpp
@@ -200,7 +200,6 @@ CPDF_ContentParser::Stage CPDF_ContentParser::Parse() { if (!m_pParser) { m_RecursionState.parsed_set.clear(); - m_RecursionState.form_count = 0; m_pParser = std::make_unique<CPDF_StreamContentParser>( m_pPageObjectHolder->GetDocument(), m_pPageObjectHolder->GetMutablePageResources(), nullptr, nullptr,
diff --git a/core/fpdfapi/page/cpdf_form.h b/core/fpdfapi/page/cpdf_form.h index ba0fbd4..3ced731 100644 --- a/core/fpdfapi/page/cpdf_form.h +++ b/core/fpdfapi/page/cpdf_form.h
@@ -29,7 +29,6 @@ ~RecursionState(); std::set<const uint8_t*> parsed_set; - int form_count = 0; }; // Helper method to choose the first non-null resources dictionary.
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp index 38fead5..51553c0 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp +++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -51,9 +51,6 @@ constexpr int kMaxFormLevel = 40; -// Upper limit for the number of form XObjects within a form XObject. -constexpr int kFormCountLimit = 8192; - constexpr int kSingleCoordinatePair = 1; constexpr int kTensorCoordinatePairs = 16; constexpr int kCoonsCoordinatePairs = 12; @@ -748,16 +745,7 @@ const ByteString type = pXObject->GetDict()->GetByteStringFor("Subtype"); if (type == "Form") { - if (m_RecursionState->form_count > kFormCountLimit) { - return; - } - - const bool is_first = m_RecursionState->form_count == 0; - ++m_RecursionState->form_count; AddForm(std::move(pXObject), name); - if (is_first) { - m_RecursionState->form_count = 0; - } return; }