aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-08-21 18:50:36 +0200
committerJay Berkenbilt <ejb@ql.org>2019-08-22 23:55:16 +0200
commit225cd9dac27d685833156dfc249838cda11cd2ef (patch)
treec839a3bcc99c08150459ca24de5750f4e5a04e10 /include
parentae5bd7102da5d4b456f08790a0efc04c1c42b4a5 (diff)
downloadqpdf-225cd9dac27d685833156dfc249838cda11cd2ef.tar.zst
Protect against coding error of re-entrant parsing
Diffstat (limited to 'include')
-rw-r--r--include/qpdf/QPDF.hh27
1 files changed, 27 insertions, 0 deletions
diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh
index f052cb33..5fae5a57 100644
--- a/include/qpdf/QPDF.hh
+++ b/include/qpdf/QPDF.hh
@@ -657,6 +657,31 @@ class QPDF
};
friend class Warner;
+ // ParseGuard class allows QPDFObjectHandle to detect re-entrant
+ // resolution
+ class ParseGuard
+ {
+ friend class QPDFObjectHandle;
+ private:
+ ParseGuard(QPDF* qpdf) :
+ qpdf(qpdf)
+ {
+ if (qpdf)
+ {
+ qpdf->inParse(true);
+ }
+ }
+ ~ParseGuard()
+ {
+ if (qpdf)
+ {
+ qpdf->inParse(false);
+ }
+ }
+ QPDF* qpdf;
+ };
+ friend class ParseGuard;
+
// Pipe class is restricted to QPDF_Stream
class Pipe
{
@@ -816,6 +841,7 @@ class QPDF
friend class ResolveRecorder;
void parse(char const* password);
+ void inParse(bool);
void warn(QPDFExc const& e);
void setTrailer(QPDFObjectHandle obj);
void read_xref(qpdf_offset_t offset);
@@ -1352,6 +1378,7 @@ class QPDF
bool reconstructed_xref;
bool fixed_dangling_refs;
bool immediate_copy_from;
+ bool in_parse;
// Linearization data
qpdf_offset_t first_xref_item_offset; // actual value from file