summaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2017-08-09 03:44:37 +0200
committerJay Berkenbilt <ejb@ql.org>2017-08-11 01:01:41 +0200
commitef8ae5449dc30782451beba64fdd0af86e1cb931 (patch)
tree5ed173f9f86c578ba1ee08b06f63f23ecad2369a /libqpdf
parent8320d16cd20240cc35ec84de6bb89f2d9431ea2d (diff)
downloadqpdf-ef8ae5449dc30782451beba64fdd0af86e1cb931.tar.zst
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.
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDF.cc5
-rw-r--r--libqpdf/QPDFTokenizer.cc18
2 files changed, 16 insertions, 7 deletions
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<InputSource> input,
}
QPDFTokenizer::Token
-QPDF::readToken(PointerHolder<InputSource> input)
+QPDF::readToken(PointerHolder<InputSource> 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<InputSource> 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<InputSource> 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;
}