diff options
author | Jay Berkenbilt <jberkenbilt@users.noreply.github.com> | 2024-01-08 14:35:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-08 14:35:18 +0100 |
commit | 8ba968bd86a34ee09fb9e463381be10286fefabb (patch) | |
tree | 8534d138db4f9f355dca4bd65c520bec479bb104 /libqpdf/QPDF.cc | |
parent | 1d96af8b9f72f66d48b77c5232b3e4d38d6683ca (diff) | |
parent | 8715d6a69389646a1dfd224f618ee6af4e487a1b (diff) | |
download | qpdf-8ba968bd86a34ee09fb9e463381be10286fefabb.tar.zst |
Merge pull request #1112 from m-holger/gcog
Tweaks to QPDF::read_xref, removeObject and getCompressibleObjGens
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r-- | libqpdf/QPDF.cc | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 3718eb7e..41ecd54a 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -706,6 +706,14 @@ 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 last_og{-1, 0}; + for (auto const& [og, _xref]: m->xref_table) { + if (og.getObj() == last_og.getObj()) + removeObject(last_og); + last_og = og; + } } bool @@ -1979,6 +1987,18 @@ QPDF::replaceObject(QPDFObjGen const& og, QPDFObjectHandle oh) } void +QPDF::removeObject(QPDFObjGen og) +{ + m->xref_table.erase(og); + if (auto cached = m->obj_cache.find(og); cached != m->obj_cache.end()) { + // Take care of any object handles that may be floating around. + cached->second.object->assign(QPDF_Null::create()); + cached->second.object->setObjGen(nullptr, QPDFObjGen()); + m->obj_cache.erase(cached); + } +} + +void QPDF::replaceReserved(QPDFObjectHandle reserved, QPDFObjectHandle replacement) { QTC::TC("qpdf", "QPDF replaceReserved"); |