diff options
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"); |