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,6 +26,8 @@
26 #include <cstdlib> 26 #include <cstdlib>
27 #include <stdexcept> 27 #include <stdexcept>
28 28
  29 +using namespace std::literals;
  30 +
29 QPDFWriter::ProgressReporter::~ProgressReporter() // NOLINT (modernize-use-equals-default) 31 QPDFWriter::ProgressReporter::~ProgressReporter() // NOLINT (modernize-use-equals-default)
30 { 32 {
31 // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer 33 // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer
@@ -1296,17 +1298,24 @@ QPDFWriter::willFilterStream( @@ -1296,17 +1298,24 @@ QPDFWriter::willFilterStream(
1296 !filter ? qpdf_dl_none : (uncompress ? qpdf_dl_all : m->stream_decode_level), 1298 !filter ? qpdf_dl_none : (uncompress ? qpdf_dl_all : m->stream_decode_level),
1297 false, 1299 false,
1298 first_attempt); 1300 first_attempt);
  1301 + if (filter && !filtered) {
  1302 + // Try again
  1303 + filter = false;
  1304 + stream.setFilterOnWrite(false);
  1305 + } else {
  1306 + break;
  1307 + }
1299 } catch (std::runtime_error& e) { 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 throw std::runtime_error( 1316 throw std::runtime_error(
1301 "error while getting stream data for " + stream.unparse() + ": " + e.what()); 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 if (!filtered) { 1320 if (!filtered) {
1312 compress_stream = false; 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 qpdf: error while getting stream data for 4 0 R: base64-decode: base64 decode: invalid input 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 qpdf: error while getting stream data for 4 0 R: open file does not exist: No such file or directory 3 qpdf: error while getting stream data for 4 0 R: open file does not exist: No such file or directory