From d31a7b76e7fa6fc6fa31d94394b59f990920d09c Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Tue, 12 Sep 2017 15:48:08 -0400 Subject: Improve message for stream decoding error Tweak the message so that we inform the user that we are mitigating data loss. --- libqpdf/QPDF.cc | 10 +++++++++- libqpdf/QPDFObjectHandle.cc | 12 +++++++++++- libqpdf/QPDFWriter.cc | 2 +- libqpdf/QPDF_Stream.cc | 9 +++++---- libqpdf/qpdf/QPDF_Stream.hh | 2 +- 5 files changed, 27 insertions(+), 8 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index bea83c98..1ec0d6b6 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -2382,7 +2382,8 @@ QPDF::pipeStreamData(int objid, int generation, qpdf_offset_t offset, size_t length, QPDFObjectHandle stream_dict, Pipeline* pipeline, - bool suppress_warnings) + bool suppress_warnings, + bool will_retry) { bool success = false; std::vector > to_delete; @@ -2430,6 +2431,13 @@ QPDF::pipeStreamData(int objid, int generation, "error decoding stream data for object " + QUtil::int_to_string(objid) + " " + QUtil::int_to_string(generation) + ": " + e.what())); + if (will_retry) + { + warn(QPDFExc(qpdf_e_damaged_pdf, this->m->file->getName(), + "", this->m->file->getLastOffset(), + "stream will be re-processed without" + " filtering to avoid data loss")); + } } } if (! success) diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 888d9a3a..247b3b38 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -500,10 +500,20 @@ QPDFObjectHandle::pipeStreamData(Pipeline* p, unsigned long encode_flags, qpdf_stream_decode_level_e decode_level, bool suppress_warnings) +{ + return pipeStreamData( + p, encode_flags, decode_level, suppress_warnings, false); +} + +bool +QPDFObjectHandle::pipeStreamData(Pipeline* p, + unsigned long encode_flags, + qpdf_stream_decode_level_e decode_level, + bool suppress_warnings, bool will_retry) { assertStream(); return dynamic_cast(obj.getPointer())->pipeStreamData( - p, encode_flags, decode_level, suppress_warnings); + p, encode_flags, decode_level, suppress_warnings, will_retry); } bool diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 1ce4bfb6..d4e13310 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -1623,7 +1623,7 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, ((filter && compress) ? qpdf_ef_compress : 0)), (filter ? (uncompress ? qpdf_dl_all : this->m->stream_decode_level) - : qpdf_dl_none)); + : qpdf_dl_none), false, (attempt == 1)); popPipelineStack(&stream_data); if (filter && (! filtered)) { diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index 27c6b477..cf26f001 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -94,7 +94,7 @@ PointerHolder QPDF_Stream::getStreamData(qpdf_stream_decode_level_e decode_level) { Pl_Buffer buf("stream data buffer"); - if (! pipeStreamData(&buf, 0, decode_level, false)) + if (! pipeStreamData(&buf, 0, decode_level, false, false)) { throw std::logic_error("getStreamData called on unfilterable stream"); } @@ -106,7 +106,7 @@ PointerHolder QPDF_Stream::getRawStreamData() { Pl_Buffer buf("stream data buffer"); - pipeStreamData(&buf, 0, qpdf_dl_none, false); + pipeStreamData(&buf, 0, qpdf_dl_none, false, false); QTC::TC("qpdf", "QPDF_Stream getRawStreamData"); return buf.getBuffer(); } @@ -373,7 +373,7 @@ bool QPDF_Stream::pipeStreamData(Pipeline* pipeline, unsigned long encode_flags, qpdf_stream_decode_level_e decode_level, - bool suppress_warnings) + bool suppress_warnings, bool will_retry) { std::vector filters; int predictor = 1; @@ -540,7 +540,8 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, if (! QPDF::Pipe::pipeStreamData(this->qpdf, this->objid, this->generation, this->offset, this->length, this->stream_dict, pipeline, - suppress_warnings)) + suppress_warnings, + will_retry)) { filter = false; } diff --git a/libqpdf/qpdf/QPDF_Stream.hh b/libqpdf/qpdf/QPDF_Stream.hh index a2bd5d61..50771627 100644 --- a/libqpdf/qpdf/QPDF_Stream.hh +++ b/libqpdf/qpdf/QPDF_Stream.hh @@ -25,7 +25,7 @@ class QPDF_Stream: public QPDFObject bool pipeStreamData(Pipeline*, unsigned long encode_flags, qpdf_stream_decode_level_e decode_level, - bool suppress_warnings); + bool suppress_warnings, bool will_retry); PointerHolder getStreamData(qpdf_stream_decode_level_e); PointerHolder getRawStreamData(); void replaceStreamData(PointerHolder data, -- cgit v1.2.3-54-g00ecf