Commit ff0affd81d58cecfbe2cc2e3f5cc2d9895bf922b
1 parent
642a1110
In QPDFWriter::willFilterStream on runtime error on first attempt retry
without filtering
Showing
3 changed files
with
20 additions
and
7 deletions
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 | ... | ... |