diff options
author | Jay Berkenbilt <ejb@ql.org> | 2012-08-11 15:27:30 +0200 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2012-08-11 15:29:04 +0200 |
commit | 29e9c34fe344616ec0e9e20bb2f055c7fb80a26d (patch) | |
tree | c35df45cc1dd05534420dea1901334f44aac343d /libqpdf | |
parent | 137dc7acb9f46dfe40b73dd0079bf130eb6981e0 (diff) | |
download | qpdf-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')
-rw-r--r-- | libqpdf/QPDFTokenizer.cc | 35 |
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 { |