From 4ebe54529cdce132a12f4a205ff7cc7c3641cda0 Mon Sep 17 00:00:00 2001 From: m-holger Date: Sat, 2 Aug 2025 00:50:19 +0100 Subject: [PATCH] Fix linearization logic to conditionally add outlines object only if erased, ensuring robustness against damaged PDFs. --- libqpdf/QPDF_linearization.cc | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/libqpdf/QPDF_linearization.cc b/libqpdf/QPDF_linearization.cc index ce72f98..660290f 100644 --- a/libqpdf/QPDF_linearization.cc +++ b/libqpdf/QPDF_linearization.cc @@ -1412,14 +1412,20 @@ QPDF::pushOutlinesToPart( QTC::TC( "qpdf", "QPDF lin outlines in part", - ((&part == (&m->part6)) ? 0 - : (&part == (&m->part9)) ? 1 - : 9999)); // can't happen - m->c_outline_data.first_object = outlines_og.getObj(); - m->c_outline_data.nobjects = 1; - lc_outlines.erase(outlines_og); - part.push_back(outlines); + &part == &m->part6 ? 0 + : (&part == &m->part9) ? 1 + : 9999); // can't happen + if (lc_outlines.erase(outlines_og)) { + // Make sure outlines is in lc_outlines in case the file is damaged. in which case it may be + // included in an earlier part. + part.push_back(outlines); + m->c_outline_data.first_object = outlines_og.getObj(); + m->c_outline_data.nobjects = 1; + } for (auto const& og: lc_outlines) { + if (!m->c_outline_data.first_object) { + m->c_outline_data.first_object = og.getObj(); + } part.push_back(getObject(og)); ++m->c_outline_data.nobjects; } -- libgit2 0.21.4