aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2024-01-17 11:39:06 +0100
committerm-holger <m-holger@kubitscheck.org>2024-01-17 11:39:06 +0100
commit6e3b7982dbcf8087374694253e0e248fbc6c6e3e (patch)
tree9dd7f6a56b669da65f3653ced2f1b449e3d4f79e /libqpdf
parent0109e365decfdc2e8fbb920b4179d32daeeb96ae (diff)
downloadqpdf-6e3b7982dbcf8087374694253e0e248fbc6c6e3e.tar.zst
Fix incorrect handling of invalid negative object ids
Fix two errors introduced in #1110 and #1112. Since #1110, encountering the invalid indirect reference #1110 -2147483648 n R produces an integer underflow which, if undetected, immediately trigger a logic error. Since #1112, object -1 0 R may be incorrectly identified as an earlier generation of itself and deleted, invalidating a live iterator.
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDF.cc9
1 files changed, 5 insertions, 4 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index 89d4a0a8..8cff3dfd 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -709,10 +709,11 @@ QPDF::read_xref(qpdf_offset_t xref_offset)
// Make sure we keep only the highest generation for any object.
QPDFObjGen last_og{-1, 0};
- for (auto const& og: m->xref_table) {
- if (og.first.getObj() == last_og.getObj())
+ for (auto const& item: m->xref_table) {
+ auto id = item.first.getObj();
+ if (id == last_og.getObj() && id > 0)
removeObject(last_og);
- last_og = og.first;
+ last_og = item.first;
}
}
@@ -2405,7 +2406,7 @@ QPDF::getCompressibleObjGens()
while (!queue.empty()) {
auto obj = queue.back();
queue.pop_back();
- if (obj.isIndirect()) {
+ if (obj.getObjectID() > 0) {
QPDFObjGen og = obj.getObjGen();
const size_t id = toS(og.getObj() - 1);
if (id >= max_obj)