aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF.cc
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2023-07-04 17:34:22 +0200
committerm-holger <m-holger@kubitscheck.org>2023-07-04 20:59:09 +0200
commit8e6974710cc75b3acfb592db9fb6fd8611c39732 (patch)
tree185918fa7fb7848e49771af051cdf596213cb0ea /libqpdf/QPDF.cc
parent250a7364828da874fd728808f48443f8cfa5132d (diff)
downloadqpdf-8e6974710cc75b3acfb592db9fb6fd8611c39732.tar.zst
Add private method QPDF::insertFreeXrefEntry
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r--libqpdf/QPDF.cc34
1 files changed, 20 insertions, 14 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index e93ffb85..53634485 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -890,7 +890,7 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset)
// Handle any deleted items now that we've read the /XRefStm.
for (auto const& og: deleted_items) {
- insertXrefEntry(og.getObj(), 0, 0, og.getGen());
+ insertFreeXrefEntry(og);
}
if (cur_trailer.hasKey("/Prev")) {
@@ -1088,9 +1088,10 @@ QPDF::processXRefStream(qpdf_offset_t xref_offset, QPDFObjectHandle& xref_obj)
if (fields[0] == 0) {
// Ignore fields[2], which we don't care about in this case. This works around the issue
// of some PDF files that put invalid values, like -1, here for deleted objects.
- fields[2] = 0;
+ insertFreeXrefEntry(QPDFObjGen(obj, 0));
+ } else {
+ insertXrefEntry(obj, toI(fields[0]), fields[1], toI(fields[2]));
}
- insertXrefEntry(obj, toI(fields[0]), fields[1], toI(fields[2]));
}
if (!m->trailer.isInitialized()) {
@@ -1121,29 +1122,26 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2)
// If there is already an entry for this object and generation in the table, it means that a
// later xref table has registered this object. Disregard this one.
- QPDFObjGen og(obj, (f0 == 2 ? 0 : f2));
- if (m->xref_table.count(og)) {
- QTC::TC("qpdf", "QPDF xref reused object");
- return;
- }
if (m->deleted_objects.count(obj)) {
QTC::TC("qpdf", "QPDF xref deleted object");
return;
}
- switch (f0) {
- case 0:
- m->deleted_objects.insert(obj);
- break;
+ auto [iter, created] = m->xref_table.try_emplace(QPDFObjGen(obj, (f0 == 2 ? 0 : f2)));
+ if (!created) {
+ QTC::TC("qpdf", "QPDF xref reused object");
+ return;
+ }
+ switch (f0) {
case 1:
// f2 is generation
QTC::TC("qpdf", "QPDF xref gen > 0", ((f2 > 0) ? 1 : 0));
- m->xref_table[og] = QPDFXRefEntry(f1);
+ iter->second = QPDFXRefEntry(f1);
break;
case 2:
- m->xref_table[og] = QPDFXRefEntry(toI(f1), f2);
+ iter->second = QPDFXRefEntry(toI(f1), f2);
break;
default:
@@ -1152,6 +1150,14 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2)
}
}
+void
+QPDF::insertFreeXrefEntry(QPDFObjGen og)
+{
+ if (!m->xref_table.count(og)) {
+ m->deleted_objects.insert(og.getObj());
+ }
+}
+
// Replace uncompressed object. This is used in xref recovery mode, which reads the file from
// beginning to end.
void