aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf/QPDF.cc')
-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");