From ef8ae5449dc30782451beba64fdd0af86e1cb931 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Tue, 8 Aug 2017 21:44:37 -0400 Subject: Allow QPDFTokenizer::readToken to return bad tokens Sometimes we want to ignore bad tokens rather than having them throw an exception. A coverage case is commented out here and added in a later commit. --- libqpdf/QPDF.cc | 5 +++-- libqpdf/QPDFTokenizer.cc | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index cfadaa3a..3a8dc875 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -1329,9 +1329,10 @@ QPDF::recoverStreamLength(PointerHolder input, } QPDFTokenizer::Token -QPDF::readToken(PointerHolder input) +QPDF::readToken(PointerHolder input, bool allow_bad) { - return this->tokenizer.readToken(input, this->last_object_description); + return this->tokenizer.readToken( + input, this->last_object_description, allow_bad); } QPDFObjectHandle diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc index f7124e49..c0e09279 100644 --- a/libqpdf/QPDFTokenizer.cc +++ b/libqpdf/QPDFTokenizer.cc @@ -475,7 +475,8 @@ QPDFTokenizer::betweenTokens() QPDFTokenizer::Token QPDFTokenizer::readToken(PointerHolder input, - std::string const& context) + std::string const& context, + bool allow_bad) { qpdf_offset_t offset = input->tell(); Token token; @@ -514,13 +515,20 @@ QPDFTokenizer::readToken(PointerHolder input, input->unreadCh(char_to_unread); } + input->setLastOffset(offset); + if (token.getType() == tt_bad) { - throw QPDFExc(qpdf_e_damaged_pdf, input->getName(), - context, offset, token.getErrorMessage()); + if (allow_bad) + { +// QTC::TC("qpdf", "QPDFTokenizer allowing bad token"); + } + else + { + throw QPDFExc(qpdf_e_damaged_pdf, input->getName(), + context, offset, token.getErrorMessage()); + } } - input->setLastOffset(offset); - return token; } -- cgit v1.2.3-54-g00ecf