From 07f6c635a95d8c20040896646394c1e5a8a64784 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 7 Jan 2024 17:05:35 -0500 Subject: Bug fix: treat old generations of reused objects as null --- libqpdf/QPDF.cc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'libqpdf/QPDF.cc') 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 @@ -1978,6 +1991,18 @@ QPDF::replaceObject(QPDFObjGen const& og, QPDFObjectHandle oh) updateCache(og, oh.getObj(), -1, -1); } +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) { -- cgit v1.2.3-70-g09d2 From 5641832e54e347c2c33e9304d96cca450eb305ed Mon Sep 17 00:00:00 2001 From: m-holger Date: Mon, 8 Jan 2024 11:43:57 +0000 Subject: Tweak QPDF::read_xref --- libqpdf/QPDF.cc | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) (limited to 'libqpdf/QPDF.cc') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index a089a6c2..5d09f900 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -708,16 +708,11 @@ QPDF::read_xref(qpdf_offset_t xref_offset) 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); + 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; } } -- cgit v1.2.3-70-g09d2 From 8715d6a69389646a1dfd224f618ee6af4e487a1b Mon Sep 17 00:00:00 2001 From: m-holger Date: Mon, 8 Jan 2024 11:49:21 +0000 Subject: Tweak QPDF::replaceObject --- include/qpdf/QPDF.hh | 2 +- libqpdf/QPDF.cc | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'libqpdf/QPDF.cc') diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh index 9ab3ae3f..a836c3c9 100644 --- a/include/qpdf/QPDF.hh +++ b/include/qpdf/QPDF.hh @@ -1038,7 +1038,7 @@ class QPDF QPDFObjectHandle makeIndirectFromQPDFObject(std::shared_ptr const& obj); bool isCached(QPDFObjGen const& og); bool isUnresolved(QPDFObjGen const& og); - void removeObject(QPDFObjGen const& og); + void removeObject(QPDFObjGen og); void updateCache( QPDFObjGen const& og, std::shared_ptr const& object, diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 5d09f900..41ecd54a 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -1987,15 +1987,15 @@ QPDF::replaceObject(QPDFObjGen const& og, QPDFObjectHandle oh) } void -QPDF::removeObject(QPDFObjGen const& og) +QPDF::removeObject(QPDFObjGen og) { - auto null = QPDFObjectHandle::newNull(); m->xref_table.erase(og); - if (isCached(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. - replaceObject(og, null); + cached->second.object->assign(QPDF_Null::create()); + cached->second.object->setObjGen(nullptr, QPDFObjGen()); + m->obj_cache.erase(cached); } - m->obj_cache.erase(og); } void -- cgit v1.2.3-70-g09d2