Commit ff0affd81d58cecfbe2cc2e3f5cc2d9895bf922b

Authored by m-holger
1 parent 642a1110

In QPDFWriter::willFilterStream on runtime error on first attempt retry

without filtering
libqpdf/QPDFWriter.cc
... ... @@ -26,6 +26,8 @@
26 26 #include <cstdlib>
27 27 #include <stdexcept>
28 28  
  29 +using namespace std::literals;
  30 +
29 31 QPDFWriter::ProgressReporter::~ProgressReporter() // NOLINT (modernize-use-equals-default)
30 32 {
31 33 // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer
... ... @@ -1296,17 +1298,24 @@ QPDFWriter::willFilterStream(
1296 1298 !filter ? qpdf_dl_none : (uncompress ? qpdf_dl_all : m->stream_decode_level),
1297 1299 false,
1298 1300 first_attempt);
  1301 + if (filter && !filtered) {
  1302 + // Try again
  1303 + filter = false;
  1304 + stream.setFilterOnWrite(false);
  1305 + } else {
  1306 + break;
  1307 + }
1299 1308 } catch (std::runtime_error& e) {
  1309 + if (filter && first_attempt) {
  1310 + stream.warnIfPossible("error while getting stream data: "s + e.what());
  1311 + stream.warnIfPossible("qpdf will attempt to write the damaged stream unchanged");
  1312 + filter = false;
  1313 + stream.setFilterOnWrite(false);
  1314 + continue;
  1315 + }
1300 1316 throw std::runtime_error(
1301 1317 "error while getting stream data for " + stream.unparse() + ": " + e.what());
1302 1318 }
1303   - if (filter && !filtered) {
1304   - // Try again
1305   - filter = false;
1306   - stream.setFilterOnWrite(false);
1307   - } else {
1308   - break;
1309   - }
1310 1319 }
1311 1320 if (!filtered) {
1312 1321 compress_stream = false;
... ...
qpdf/qtest/qpdf/qjson-bad-data.out
  1 +WARNING: qjson-bad-data.json, obj:4 0 R at offset 0: error while getting stream data: base64-decode: base64 decode: invalid input
  2 +WARNING: qjson-bad-data.json, obj:4 0 R at offset 0: qpdf will attempt to write the damaged stream unchanged
1 3 qpdf: error while getting stream data for 4 0 R: base64-decode: base64 decode: invalid input
... ...
qpdf/qtest/qpdf/qjson-bad-datafile.out
  1 +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
  2 +WARNING: qjson-bad-datafile.json, obj:4 0 R at offset 0: qpdf will attempt to write the damaged stream unchanged
1 3 qpdf: error while getting stream data for 4 0 R: open file does not exist: No such file or directory
... ...