summaryrefslogtreecommitdiffstats
path: root/include/qpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2015-02-22 00:22:32 +0100
committerJay Berkenbilt <ejb@ql.org>2015-02-22 01:47:11 +0100
commita11549a566ceed28bc9f6ba100b0d3f6ae59a1f4 (patch)
tree4868bd8264af045ea8796f3a7cd74ccc5f462bb9 /include/qpdf
parent28a9df5119af12d6d97edf4fa97f88ce23865096 (diff)
downloadqpdf-a11549a566ceed28bc9f6ba100b0d3f6ae59a1f4.tar.zst
Detect loops in /Pages structure
Pushing inherited objects to pages and getting all pages were both prone to stack overflow infinite loops if there were loops in the Pages dictionary. There is a general weakness in the code in that any part of the code that traverses the Pages structure would be prone to this and would have to implement its own loop detection. A more robust fix may provide some general method for handling the Pages structure, but it's probably not worth doing. Note: addition of *Internal2 private functions was done rather than changing signatures of existing methods to avoid breaking compatibility.
Diffstat (limited to 'include/qpdf')
-rw-r--r--include/qpdf/QPDF.hh9
1 files changed, 9 insertions, 0 deletions
diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh
index dfce40c1..71ff7e27 100644
--- a/include/qpdf/QPDF.hh
+++ b/include/qpdf/QPDF.hh
@@ -668,6 +668,9 @@ class QPDF
void getAllPagesInternal(QPDFObjectHandle cur_pages,
std::vector<QPDFObjectHandle>& result);
+ void getAllPagesInternal2(QPDFObjectHandle cur_pages,
+ std::vector<QPDFObjectHandle>& result,
+ std::set<QPDFObjGen>& visited);
void insertPage(QPDFObjectHandle newpage, int pos);
int findPage(QPDFObjGen const& og);
int findPage(QPDFObjectHandle& page);
@@ -1023,6 +1026,12 @@ class QPDF
std::map<std::string, std::vector<QPDFObjectHandle> >&,
std::vector<QPDFObjectHandle>& all_pages,
bool allow_changes, bool warn_skipped_keys);
+ void pushInheritedAttributesToPageInternal2(
+ QPDFObjectHandle,
+ std::map<std::string, std::vector<QPDFObjectHandle> >&,
+ std::vector<QPDFObjectHandle>& all_pages,
+ bool allow_changes, bool warn_skipped_keys,
+ std::set<QPDFObjGen>& visited);
void updateObjectMaps(ObjUser const& ou, QPDFObjectHandle oh);
void updateObjectMapsInternal(ObjUser const& ou, QPDFObjectHandle oh,
std::set<QPDFObjGen>& visited, bool top);