From 42d396f1dd8d38294e45b14021cd72c13850a53b Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 18 Aug 2019 21:26:19 -0400 Subject: Handle invalid name tokens symmetrically for PDF < 1.2 (fixes #332) --- libqpdf/QPDFObjectHandle.cc | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'libqpdf/QPDFObjectHandle.cc') diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 3fa0266c..1b3b64b0 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -1616,7 +1616,8 @@ QPDFObjectHandle::parseContentStream_internal( PointerHolder stream_data = buf.getBuffer(); try { - parseContentStream_data(stream_data, all_description, callbacks); + parseContentStream_data(stream_data, all_description, + callbacks, getOwningQPDF()); } catch (TerminateParsing&) { @@ -1629,7 +1630,8 @@ void QPDFObjectHandle::parseContentStream_data( PointerHolder stream_data, std::string const& description, - ParserCallbacks* callbacks) + ParserCallbacks* callbacks, + QPDF* context) { size_t length = stream_data->getSize(); PointerHolder input = @@ -1640,7 +1642,8 @@ QPDFObjectHandle::parseContentStream_data( while (QIntC::to_size(input->tell()) < length) { QPDFObjectHandle obj = - parseInternal(input, "content", tokenizer, empty, 0, 0, true); + parseInternal(input, "content", tokenizer, + empty, 0, context, true); if (! obj.isInitialized()) { // EOF @@ -1660,9 +1663,10 @@ QPDFObjectHandle::parseContentStream_data( if (t.getType() == QPDFTokenizer::tt_bad) { QTC::TC("qpdf", "QPDFObjectHandle EOF in inline image"); - throw QPDFExc(qpdf_e_damaged_pdf, input->getName(), - "stream data", input->tell(), - "EOF found while reading inline image"); + warn(context, + QPDFExc(qpdf_e_damaged_pdf, input->getName(), + "stream data", input->tell(), + "EOF found while reading inline image")); } else { @@ -1737,6 +1741,16 @@ QPDFObjectHandle::parseInternal(PointerHolder input, QPDFTokenizer::Token token = tokenizer.readToken(input, object_description, true); + std::string const& token_error_message = token.getErrorMessage(); + if (! token_error_message.empty()) + { + // Tokens other than tt_bad can still generate warnings. + warn(context, + QPDFExc(qpdf_e_damaged_pdf, input->getName(), + object_description, + input->getLastOffset(), + token_error_message)); + } switch (token.getType()) { @@ -1756,11 +1770,6 @@ QPDFObjectHandle::parseInternal(PointerHolder input, case QPDFTokenizer::tt_bad: QTC::TC("qpdf", "QPDFObjectHandle bad token in parse"); - warn(context, - QPDFExc(qpdf_e_damaged_pdf, input->getName(), - object_description, - input->getLastOffset(), - token.getErrorMessage())); bad = true; object = newNull(); break; -- cgit v1.2.3-54-g00ecf