aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFTokenizer.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2012-08-11 15:27:30 +0200
committerJay Berkenbilt <ejb@ql.org>2012-08-11 15:29:04 +0200
commit29e9c34fe344616ec0e9e20bb2f055c7fb80a26d (patch)
treec35df45cc1dd05534420dea1901334f44aac343d /libqpdf/QPDFTokenizer.cc
parent137dc7acb9f46dfe40b73dd0079bf130eb6981e0 (diff)
downloadqpdf-29e9c34fe344616ec0e9e20bb2f055c7fb80a26d.tar.zst
Bug fix: let EOF resolve literal token
Previously only whitespace and comments did it. This fix is needed for object streams whose last object is a literal (name, integer, real, string) not terminated by space or newline.
Diffstat (limited to 'libqpdf/QPDFTokenizer.cc')
-rw-r--r--libqpdf/QPDFTokenizer.cc35
1 files changed, 20 insertions, 15 deletions
diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc
index 78ab1551..1a20bb5a 100644
--- a/libqpdf/QPDFTokenizer.cc
+++ b/libqpdf/QPDFTokenizer.cc
@@ -434,22 +434,19 @@ QPDFTokenizer::presentCharacter(char ch)
void
QPDFTokenizer::presentEOF()
{
- switch (state)
+ if (state == st_literal)
{
- case st_token_ready:
- case st_top:
- // okay
- break;
-
- case st_in_comment:
- state = st_top;
- break;
-
- default:
+ QTC::TC("qpdf", "QPDF_Tokenizer EOF reading appendable token");
+ resolveLiteral();
+ }
+ else if (state != st_token_ready)
+ {
+ QTC::TC("qpdf", "QPDF_Tokenizer EOF reading token");
type = tt_bad;
error_message = "EOF while reading token";
- state = st_token_ready;
}
+
+ state = st_token_ready;
}
bool
@@ -480,14 +477,22 @@ QPDFTokenizer::readToken(PointerHolder<InputSource> input,
Token token;
bool unread_char;
char char_to_unread;
+ bool presented_eof = false;
while (! getToken(token, unread_char, char_to_unread))
{
char ch;
if (input->read(&ch, 1) == 0)
{
- throw QPDFExc(qpdf_e_damaged_pdf, input->getName(),
- context, offset,
- "EOF while reading token");
+ if (! presented_eof)
+ {
+ presentEOF();
+ presented_eof = true;
+ }
+ else
+ {
+ throw std::logic_error(
+ "getToken returned false after presenting EOF");
+ }
}
else
{