From 29e9c34fe344616ec0e9e20bb2f055c7fb80a26d Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 11 Aug 2012 09:27:30 -0400 Subject: 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. --- libqpdf/QPDFTokenizer.cc | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) (limited to 'libqpdf') 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 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 { -- cgit v1.2.3-54-g00ecf