aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-01-06 16:07:23 +0100
committerJay Berkenbilt <ejb@ql.org>2019-01-07 06:11:15 +0100
commit7588cac2957f66c6f0e3f5fb5b691ecbb8f3e0b2 (patch)
tree70f7fbac4d9f5ffc285460b2c01d4c0a33bae91b
parente27ac682e00be12e9c420c26c218ee2a01fbf232 (diff)
downloadqpdf-7588cac2957f66c6f0e3f5fb5b691ecbb8f3e0b2.tar.zst
Create an application-scope unique ID for each QPDF object
Use this instead of QPDF* as a map key for object_copiers.
-rw-r--r--include/qpdf/QPDF.hh3
-rw-r--r--libqpdf/QPDF.cc9
2 files changed, 10 insertions, 2 deletions
diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh
index 120f3593..57e30383 100644
--- a/include/qpdf/QPDF.hh
+++ b/include/qpdf/QPDF.hh
@@ -1196,6 +1196,7 @@ class QPDF
Members();
Members(Members const&);
+ unsigned long long unique_id;
QPDFTokenizer tokenizer;
PointerHolder<InputSource> file;
std::string last_object_description;
@@ -1216,7 +1217,7 @@ class QPDF
std::map<QPDFObjGen, int> pageobj_to_pages_pos;
bool pushed_inherited_attributes_to_pages;
std::vector<QPDFExc> warnings;
- std::map<QPDF*, ObjCopier> object_copiers;
+ std::map<unsigned long long, ObjCopier> object_copiers;
PointerHolder<QPDFObjectHandle::StreamDataProvider> copied_streams;
// copied_stream_data_provider is owned by copied_streams
CopiedStreamDataProvider* copied_stream_data_provider;
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<unsigned long>(QUtil::get_current_time());
+ m->unique_id <<= 32;
+ m->unique_id |= static_cast<unsigned long>(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"