diff options
author | Jay Berkenbilt <ejb@ql.org> | 2024-01-07 23:05:35 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2024-01-07 23:16:14 +0100 |
commit | 07f6c635a95d8c20040896646394c1e5a8a64784 (patch) | |
tree | d6e4f603dd14cb8a8043997df57bb62243d92ab7 /libqpdf/QPDF.cc | |
parent | 1d96af8b9f72f66d48b77c5232b3e4d38d6683ca (diff) | |
download | qpdf-07f6c635a95d8c20040896646394c1e5a8a64784.tar.zst |
Bug fix: treat old generations of reused objects as null
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r-- | libqpdf/QPDF.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 3718eb7e..a089a6c2 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -706,6 +706,19 @@ QPDF::read_xref(qpdf_offset_t xref_offset) // We no longer need the deleted_objects table, so go ahead and clear it out to make sure we // never depend on its being set. m->deleted_objects.clear(); + + // Make sure we keep only the highest generation for any object. + QPDFObjGen::set to_delete; + QPDFObjGen last_og; + for (auto const& og: m->xref_table) { + if (og.first.getObj() == last_og.getObj()) { + to_delete.emplace(last_og); + } + last_og = og.first; + } + for (auto const& og: to_delete) { + removeObject(og); + } } bool @@ -1979,6 +1992,18 @@ QPDF::replaceObject(QPDFObjGen const& og, QPDFObjectHandle oh) } void +QPDF::removeObject(QPDFObjGen const& og) +{ + auto null = QPDFObjectHandle::newNull(); + m->xref_table.erase(og); + if (isCached(og)) { + // Take care of any object handles that may be floating around. + replaceObject(og, null); + } + m->obj_cache.erase(og); +} + +void QPDF::replaceReserved(QPDFObjectHandle reserved, QPDFObjectHandle replacement) { QTC::TC("qpdf", "QPDF replaceReserved"); |