summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fpdfapi/parser/cpdf_document.cpp1
-rw-r--r--core/fpdfapi/parser/cpdf_document_unittest.cpp29
2 files changed, 30 insertions, 0 deletions
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp
index c047085cf3..dec0f5097e 100644
--- a/core/fpdfapi/parser/cpdf_document.cpp
+++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -406,6 +406,7 @@ CPDF_Dictionary* CPDF_Document::TraversePDFPages(int iPage,
CPDF_Dictionary* pPages = m_pTreeTraversal[level].first;
CPDF_Array* pKidList = pPages->GetArrayFor("Kids");
if (!pKidList) {
+ m_pTreeTraversal.pop_back();
if (*nPagesToGo != 1)
return nullptr;
m_PageList[iPage] = pPages->GetObjNum();
diff --git a/core/fpdfapi/parser/cpdf_document_unittest.cpp b/core/fpdfapi/parser/cpdf_document_unittest.cpp
index 379ca047a1..f052af3aec 100644
--- a/core/fpdfapi/parser/cpdf_document_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_document_unittest.cpp
@@ -12,6 +12,7 @@
#include "core/fpdfapi/parser/cpdf_boolean.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_linearized_header.h"
+#include "core/fpdfapi/parser/cpdf_name.h"
#include "core/fpdfapi/parser/cpdf_number.h"
#include "core/fpdfapi/parser/cpdf_parser.h"
#include "core/fpdfapi/parser/cpdf_reference.h"
@@ -131,6 +132,23 @@ class TestLinearized : public CPDF_LinearizedHeader {
explicit TestLinearized(CPDF_Dictionary* dict)
: CPDF_LinearizedHeader(dict) {}
};
+
+class CPDF_TestDocPagesWithoutKids : public CPDF_Document {
+ public:
+ CPDF_TestDocPagesWithoutKids() : CPDF_Document(nullptr) {
+ CPDF_Dictionary* pagesDict = NewIndirect<CPDF_Dictionary>();
+ pagesDict->SetNewFor<CPDF_Name>("Type", "Pages");
+ pagesDict->SetNewFor<CPDF_Number>("Count", 3);
+ m_PageList.resize(10);
+ m_pOwnedRootDict = pdfium::MakeUnique<CPDF_Dictionary>();
+ m_pOwnedRootDict->SetNewFor<CPDF_Reference>("Pages", this,
+ pagesDict->GetObjNum());
+ m_pRootDict = m_pOwnedRootDict.get();
+ }
+
+ private:
+ std::unique_ptr<CPDF_Dictionary> m_pOwnedRootDict;
+};
} // namespace
class cpdf_document_test : public testing::Test {
@@ -237,3 +255,14 @@ TEST_F(cpdf_document_test, CountGreaterThanPageTree) {
EXPECT_FALSE(document->GetPage(i));
EXPECT_TRUE(document->GetPage(kNumTestPages - 1));
}
+
+TEST_F(cpdf_document_test, PagesWithoutKids) {
+ // Set up a document with Pages dict without kids, and Count = 3
+ auto pDoc = pdfium::MakeUnique<CPDF_TestDocPagesWithoutKids>();
+ EXPECT_TRUE(pDoc->GetPage(0));
+ // Test GetPage does not fetch pages out of range
+ for (int i = 1; i < 5; i++)
+ EXPECT_FALSE(pDoc->GetPage(i));
+
+ EXPECT_TRUE(pDoc->GetPage(0));
+}