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,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 |