aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <jberkenbilt@users.noreply.github.com>2024-01-08 14:35:18 +0100
committerGitHub <noreply@github.com>2024-01-08 14:35:18 +0100
commit8ba968bd86a34ee09fb9e463381be10286fefabb (patch)
tree8534d138db4f9f355dca4bd65c520bec479bb104 /libqpdf
parent1d96af8b9f72f66d48b77c5232b3e4d38d6683ca (diff)
parent8715d6a69389646a1dfd224f618ee6af4e487a1b (diff)
downloadqpdf-8ba968bd86a34ee09fb9e463381be10286fefabb.tar.zst
Merge pull request #1112 from m-holger/gcog
Tweaks to QPDF::read_xref, removeObject and getCompressibleObjGens
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDF.cc20
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");