aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2017-09-12 21:48:08 +0200
committerJay Berkenbilt <ejb@ql.org>2017-09-12 22:03:48 +0200
commitd31a7b76e7fa6fc6fa31d94394b59f990920d09c (patch)
treeae2c107d061eddbad986f059230dda08f296abf6 /libqpdf
parenteaacf94005ff8189e215447ffeadc341eca6c019 (diff)
downloadqpdf-d31a7b76e7fa6fc6fa31d94394b59f990920d09c.tar.zst
Improve message for stream decoding error
Tweak the message so that we inform the user that we are mitigating data loss.
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDF.cc10
-rw-r--r--libqpdf/QPDFObjectHandle.cc12
-rw-r--r--libqpdf/QPDFWriter.cc2
-rw-r--r--libqpdf/QPDF_Stream.cc9
-rw-r--r--libqpdf/qpdf/QPDF_Stream.hh2
5 files changed, 27 insertions, 8 deletions
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<PointerHolder<Pipeline> > 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
@@ -501,9 +501,19 @@ QPDFObjectHandle::pipeStreamData(Pipeline* p,
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<QPDF_Stream*>(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<Buffer>
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<Buffer>
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<std::string> 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<Buffer> getStreamData(qpdf_stream_decode_level_e);
PointerHolder<Buffer> getRawStreamData();
void replaceStreamData(PointerHolder<Buffer> data,