From 1ecc6bb29e24a4f89470ff91b2682b46e0576ad4 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 14 Oct 2023 17:04:58 -0400 Subject: Don't lose character after \d or \dd parsing string (fixes #1050) --- libqpdf/QPDFTokenizer.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'libqpdf/QPDFTokenizer.cc') diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc index d98af8a9..ca09708a 100644 --- a/libqpdf/QPDFTokenizer.cc +++ b/libqpdf/QPDFTokenizer.cc @@ -145,9 +145,8 @@ QPDFTokenizer::presentCharacter(char ch) void QPDFTokenizer::handleCharacter(char ch) { - // State machine is implemented such that the final character may not be handled. This happens - // whenever you have to use a character from the next token to detect the end of the current - // token. + // In some cases, functions called below may call a second handler. This happens whenever you + // have to use a character from the next token to detect the end of the current token. switch (this->state) { case st_top: @@ -692,16 +691,21 @@ QPDFTokenizer::inHexstring2nd(char ch) void QPDFTokenizer::inCharCode(char ch) { + bool handled = false; if (('0' <= ch) && (ch <= '7')) { this->char_code = 8 * this->char_code + (int(ch) - int('0')); if (++(this->digit_count) < 3) { return; } - // We've accumulated \ddd. PDF Spec says to ignore high-order overflow. + handled = true; } + // We've accumulated \ddd or we have \d or \dd followed by other than an octal digit. The PDF + // Spec says to ignore high-order overflow. this->val += char(this->char_code % 256); this->state = st_in_string; - return; + if (!handled) { + inString(ch); + } } void -- cgit v1.2.3-54-g00ecf