Commit 7588cac2957f66c6f0e3f5fb5b691ecbb8f3e0b2
1 parent
e27ac682
Create an application-scope unique ID for each QPDF object
Use this instead of QPDF* as a map key for object_copiers.
Showing
2 changed files
with
10 additions
and
2 deletions
include/qpdf/QPDF.hh
| @@ -1196,6 +1196,7 @@ class QPDF | @@ -1196,6 +1196,7 @@ class QPDF | ||
| 1196 | Members(); | 1196 | Members(); |
| 1197 | Members(Members const&); | 1197 | Members(Members const&); |
| 1198 | 1198 | ||
| 1199 | + unsigned long long unique_id; | ||
| 1199 | QPDFTokenizer tokenizer; | 1200 | QPDFTokenizer tokenizer; |
| 1200 | PointerHolder<InputSource> file; | 1201 | PointerHolder<InputSource> file; |
| 1201 | std::string last_object_description; | 1202 | std::string last_object_description; |
| @@ -1216,7 +1217,7 @@ class QPDF | @@ -1216,7 +1217,7 @@ class QPDF | ||
| 1216 | std::map<QPDFObjGen, int> pageobj_to_pages_pos; | 1217 | std::map<QPDFObjGen, int> pageobj_to_pages_pos; |
| 1217 | bool pushed_inherited_attributes_to_pages; | 1218 | bool pushed_inherited_attributes_to_pages; |
| 1218 | std::vector<QPDFExc> warnings; | 1219 | std::vector<QPDFExc> warnings; |
| 1219 | - std::map<QPDF*, ObjCopier> object_copiers; | 1220 | + std::map<unsigned long long, ObjCopier> object_copiers; |
| 1220 | PointerHolder<QPDFObjectHandle::StreamDataProvider> copied_streams; | 1221 | PointerHolder<QPDFObjectHandle::StreamDataProvider> copied_streams; |
| 1221 | // copied_stream_data_provider is owned by copied_streams | 1222 | // copied_stream_data_provider is owned by copied_streams |
| 1222 | CopiedStreamDataProvider* copied_stream_data_provider; | 1223 | CopiedStreamDataProvider* copied_stream_data_provider; |
libqpdf/QPDF.cc
| @@ -89,6 +89,7 @@ QPDF::EncryptionParameters::EncryptionParameters() : | @@ -89,6 +89,7 @@ QPDF::EncryptionParameters::EncryptionParameters() : | ||
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | QPDF::Members::Members() : | 91 | QPDF::Members::Members() : |
| 92 | + unique_id(0), | ||
| 92 | provided_password_is_hex_key(false), | 93 | provided_password_is_hex_key(false), |
| 93 | ignore_xref_streams(false), | 94 | ignore_xref_streams(false), |
| 94 | suppress_warnings(false), | 95 | suppress_warnings(false), |
| @@ -113,6 +114,12 @@ QPDF::QPDF() : | @@ -113,6 +114,12 @@ QPDF::QPDF() : | ||
| 113 | m(new Members()) | 114 | m(new Members()) |
| 114 | { | 115 | { |
| 115 | m->tokenizer.allowEOF(); | 116 | m->tokenizer.allowEOF(); |
| 117 | + // Generate a unique ID. It just has to be unique among all QPDF | ||
| 118 | + // objects allocated throughout the lifetime of this running | ||
| 119 | + // application. | ||
| 120 | + m->unique_id = static_cast<unsigned long>(QUtil::get_current_time()); | ||
| 121 | + m->unique_id <<= 32; | ||
| 122 | + m->unique_id |= static_cast<unsigned long>(QUtil::random()); | ||
| 116 | } | 123 | } |
| 117 | 124 | ||
| 118 | QPDF::~QPDF() | 125 | QPDF::~QPDF() |
| @@ -2103,7 +2110,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page) | @@ -2103,7 +2110,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page) | ||
| 2103 | "QPDF::copyForeign called with object from this QPDF"); | 2110 | "QPDF::copyForeign called with object from this QPDF"); |
| 2104 | } | 2111 | } |
| 2105 | 2112 | ||
| 2106 | - ObjCopier& obj_copier = this->m->object_copiers[other]; | 2113 | + ObjCopier& obj_copier = this->m->object_copiers[other->m->unique_id]; |
| 2107 | if (! obj_copier.visiting.empty()) | 2114 | if (! obj_copier.visiting.empty()) |
| 2108 | { | 2115 | { |
| 2109 | throw std::logic_error("obj_copier.visiting is not empty" | 2116 | throw std::logic_error("obj_copier.visiting is not empty" |