aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2024-01-07 23:05:35 +0100
committerJay Berkenbilt <ejb@ql.org>2024-01-07 23:16:14 +0100
commit07f6c635a95d8c20040896646394c1e5a8a64784 (patch)
treed6e4f603dd14cb8a8043997df57bb62243d92ab7 /libqpdf
parent1d96af8b9f72f66d48b77c5232b3e4d38d6683ca (diff)
downloadqpdf-07f6c635a95d8c20040896646394c1e5a8a64784.tar.zst
Bug fix: treat old generations of reused objects as null
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDF.cc25
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");