diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-08-01 12:04:30 +0100 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2018-08-03 11:03:15 +0200 |
commit | eddfa05b95a43c92a3729d3e416c77016f278f26 (patch) | |
tree | a7b58dfc7cbd2cb1b44b1b82c67b52f782682504 /vcl | |
parent | 8ed224599ae7985b577f0bf737b2b9b2e8dd47b7 (diff) |
forcepoint#65 pdf page visiting revisits itself
Change-Id: I6d9eb75f0850a94814fb4d69ea1442b826674496
Reviewed-on: https://gerrit.libreoffice.org/58417
Tested-by: Jenkins
Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/filter/ipdf/pdfdocument.cxx | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/vcl/source/filter/ipdf/pdfdocument.cxx b/vcl/source/filter/ipdf/pdfdocument.cxx index 28c49e53101d..7d4efc9e0eb0 100644 --- a/vcl/source/filter/ipdf/pdfdocument.cxx +++ b/vcl/source/filter/ipdf/pdfdocument.cxx @@ -1815,15 +1815,17 @@ size_t PDFDocument::GetObjectOffset(size_t nIndex) const const std::vector<std::unique_ptr<PDFElement>>& PDFDocument::GetElements() { return m_aElements; } /// Visits the page tree recursively, looking for page objects. -static void visitPages(PDFObjectElement* pPages, std::vector<PDFObjectElement*>& rRet) +void PDFObjectElement::visitPages(std::vector<PDFObjectElement*>& rRet) { - auto pKids = dynamic_cast<PDFArrayElement*>(pPages->Lookup("Kids")); + auto pKids = dynamic_cast<PDFArrayElement*>(Lookup("Kids")); if (!pKids) { SAL_WARN("vcl.filter", "visitPages: pages has no kids"); return; } + m_bVisiting = true; + for (const auto& pKid : pKids->GetElements()) { auto pReference = dynamic_cast<PDFReferenceElement*>(pKid); @@ -1834,14 +1836,23 @@ static void visitPages(PDFObjectElement* pPages, std::vector<PDFObjectElement*>& if (!pKidObject) continue; + // detect if visiting reenters itself + if (pKidObject->m_bVisiting) + { + SAL_WARN("vcl.filter", "visitPages: loop in hierarchy"); + continue; + } + auto pName = dynamic_cast<PDFNameElement*>(pKidObject->Lookup("Type")); if (pName && pName->GetValue() == "Pages") // Pages inside pages: recurse. - visitPages(pKidObject, rRet); + pKidObject->visitPages(rRet); else // Found an actual page. rRet.push_back(pKidObject); } + + m_bVisiting = false; } std::vector<PDFObjectElement*> PDFDocument::GetPages() @@ -1886,7 +1897,7 @@ std::vector<PDFObjectElement*> PDFDocument::GetPages() return aRet; } - visitPages(pPages, aRet); + pPages->visitPages(aRet); return aRet; } @@ -2122,6 +2133,7 @@ PDFObjectElement::PDFObjectElement(PDFDocument& rDoc, double fObjectValue, doubl : m_rDoc(rDoc) , m_fObjectValue(fObjectValue) , m_fGenerationValue(fGenerationValue) + , m_bVisiting(false) , m_pNumberElement(nullptr) , m_nDictionaryOffset(0) , m_nDictionaryLength(0) |