summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-08-01 12:04:30 +0100
committerMichael Stahl <Michael.Stahl@cib.de>2018-08-03 11:03:15 +0200
commiteddfa05b95a43c92a3729d3e416c77016f278f26 (patch)
treea7b58dfc7cbd2cb1b44b1b82c67b52f782682504 /vcl
parent8ed224599ae7985b577f0bf737b2b9b2e8dd47b7 (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.cxx20
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)