summaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF_pages.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf/QPDF_pages.cc')
-rw-r--r--libqpdf/QPDF_pages.cc21
1 files changed, 20 insertions, 1 deletions
diff --git a/libqpdf/QPDF_pages.cc b/libqpdf/QPDF_pages.cc
index 44db064c..f9b421c6 100644
--- a/libqpdf/QPDF_pages.cc
+++ b/libqpdf/QPDF_pages.cc
@@ -56,6 +56,24 @@ void
QPDF::getAllPagesInternal(QPDFObjectHandle cur_pages,
std::vector<QPDFObjectHandle>& result)
{
+ std::set<QPDFObjGen> visited;
+ getAllPagesInternal2(cur_pages, result, visited);
+}
+
+void
+QPDF::getAllPagesInternal2(QPDFObjectHandle cur_pages,
+ std::vector<QPDFObjectHandle>& result,
+ std::set<QPDFObjGen>& visited)
+{
+ QPDFObjGen this_og = cur_pages.getObjGen();
+ if (visited.count(this_og) > 0)
+ {
+ throw QPDFExc(
+ qpdf_e_pages, this->file->getName(),
+ this->last_object_description, 0,
+ "Loop detected in /Pages structure (getAllPages)");
+ }
+ visited.insert(this_og);
std::string type;
QPDFObjectHandle type_key = cur_pages.getKey("/Type");
if (type_key.isName())
@@ -76,7 +94,7 @@ QPDF::getAllPagesInternal(QPDFObjectHandle cur_pages,
int n = kids.getArrayNItems();
for (int i = 0; i < n; ++i)
{
- getAllPagesInternal(kids.getArrayItem(i), result);
+ getAllPagesInternal2(kids.getArrayItem(i), result, visited);
}
}
else if (type == "/Page")
@@ -90,6 +108,7 @@ QPDF::getAllPagesInternal(QPDFObjectHandle cur_pages,
this->file->getLastOffset(),
"invalid Type " + type + " in page tree");
}
+ visited.erase(this_og);
}
void