From 7588cac2957f66c6f0e3f5fb5b691ecbb8f3e0b2 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 6 Jan 2019 10:07:23 -0500 Subject: Create an application-scope unique ID for each QPDF object Use this instead of QPDF* as a map key for object_copiers. --- libqpdf/QPDF.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 6d8f4fae..813775a2 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -89,6 +89,7 @@ QPDF::EncryptionParameters::EncryptionParameters() : } QPDF::Members::Members() : + unique_id(0), provided_password_is_hex_key(false), ignore_xref_streams(false), suppress_warnings(false), @@ -113,6 +114,12 @@ QPDF::QPDF() : m(new Members()) { m->tokenizer.allowEOF(); + // Generate a unique ID. It just has to be unique among all QPDF + // objects allocated throughout the lifetime of this running + // application. + m->unique_id = static_cast(QUtil::get_current_time()); + m->unique_id <<= 32; + m->unique_id |= static_cast(QUtil::random()); } QPDF::~QPDF() @@ -2103,7 +2110,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page) "QPDF::copyForeign called with object from this QPDF"); } - ObjCopier& obj_copier = this->m->object_copiers[other]; + ObjCopier& obj_copier = this->m->object_copiers[other->m->unique_id]; if (! obj_copier.visiting.empty()) { throw std::logic_error("obj_copier.visiting is not empty" -- cgit v1.2.3-54-g00ecf