From ff0affd81d58cecfbe2cc2e3f5cc2d9895bf922b Mon Sep 17 00:00:00 2001 From: m-holger Date: Fri, 31 Jan 2025 14:11:15 +0000 Subject: [PATCH] In QPDFWriter::willFilterStream on runtime error on first attempt retry without filtering --- libqpdf/QPDFWriter.cc | 23 ++++++++++++++++------- qpdf/qtest/qpdf/qjson-bad-data.out | 2 ++ qpdf/qtest/qpdf/qjson-bad-datafile.out | 2 ++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index a38b213..4dda1dc 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -26,6 +26,8 @@ #include #include +using namespace std::literals; + QPDFWriter::ProgressReporter::~ProgressReporter() // NOLINT (modernize-use-equals-default) { // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer @@ -1296,17 +1298,24 @@ QPDFWriter::willFilterStream( !filter ? qpdf_dl_none : (uncompress ? qpdf_dl_all : m->stream_decode_level), false, first_attempt); + if (filter && !filtered) { + // Try again + filter = false; + stream.setFilterOnWrite(false); + } else { + break; + } } catch (std::runtime_error& e) { + if (filter && first_attempt) { + stream.warnIfPossible("error while getting stream data: "s + e.what()); + stream.warnIfPossible("qpdf will attempt to write the damaged stream unchanged"); + filter = false; + stream.setFilterOnWrite(false); + continue; + } throw std::runtime_error( "error while getting stream data for " + stream.unparse() + ": " + e.what()); } - if (filter && !filtered) { - // Try again - filter = false; - stream.setFilterOnWrite(false); - } else { - break; - } } if (!filtered) { compress_stream = false; diff --git a/qpdf/qtest/qpdf/qjson-bad-data.out b/qpdf/qtest/qpdf/qjson-bad-data.out index e5cf46b..3a3c9c5 100644 --- a/qpdf/qtest/qpdf/qjson-bad-data.out +++ b/qpdf/qtest/qpdf/qjson-bad-data.out @@ -1 +1,3 @@ +WARNING: qjson-bad-data.json, obj:4 0 R at offset 0: error while getting stream data: base64-decode: base64 decode: invalid input +WARNING: qjson-bad-data.json, obj:4 0 R at offset 0: qpdf will attempt to write the damaged stream unchanged qpdf: error while getting stream data for 4 0 R: base64-decode: base64 decode: invalid input diff --git a/qpdf/qtest/qpdf/qjson-bad-datafile.out b/qpdf/qtest/qpdf/qjson-bad-datafile.out index 1ef4f02..cd39770 100644 --- a/qpdf/qtest/qpdf/qjson-bad-datafile.out +++ b/qpdf/qtest/qpdf/qjson-bad-datafile.out @@ -1 +1,3 @@ +WARNING: qjson-bad-datafile.json, obj:4 0 R at offset 0: error while getting stream data: open file does not exist: No such file or directory +WARNING: qjson-bad-datafile.json, obj:4 0 R at offset 0: qpdf will attempt to write the damaged stream unchanged qpdf: error while getting stream data for 4 0 R: open file does not exist: No such file or directory -- libgit2 0.21.4