From 8728f7f1342a486e3a3267a7566965182e5fcbfd Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Fri, 23 Aug 2024 16:06:54 +0200 Subject: [PATCH] Support an odd number of digits in hexadecimal strings (issue 18645) See https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/PDF32000_2008.pdf#G6.1840792 --- src/core/parser.js | 33 ++++++++++++++++----------------- test/pdfs/.gitignore | 1 + test/pdfs/issue18645.pdf | Bin 0 -> 22462 bytes test/test_manifest.json | 7 +++++++ test/unit/parser_spec.js | 7 ++++--- 5 files changed, 28 insertions(+), 20 deletions(-) create mode 100644 test/pdfs/issue18645.pdf diff --git a/src/core/parser.js b/src/core/parser.js index c40f36a8298b8..94b2e7894cbcd 100644 --- a/src/core/parser.js +++ b/src/core/parser.js @@ -1163,8 +1163,8 @@ class Lexer { const strBuf = this.strBuf; strBuf.length = 0; let ch = this.currentChar; - let isFirstHex = true; - let firstDigit, secondDigit; + let firstDigit = -1, + digit = -1; this._hexStringNumWarn = 0; while (true) { @@ -1178,26 +1178,25 @@ class Lexer { ch = this.nextChar(); continue; } else { - if (isFirstHex) { - firstDigit = toHexDigit(ch); - if (firstDigit === -1) { - this._hexStringWarn(ch); - ch = this.nextChar(); - continue; - } + digit = toHexDigit(ch); + if (digit === -1) { + this._hexStringWarn(ch); + } else if (firstDigit === -1) { + firstDigit = digit; } else { - secondDigit = toHexDigit(ch); - if (secondDigit === -1) { - this._hexStringWarn(ch); - ch = this.nextChar(); - continue; - } - strBuf.push(String.fromCharCode((firstDigit << 4) | secondDigit)); + strBuf.push(String.fromCharCode((firstDigit << 4) | digit)); + firstDigit = -1; } - isFirstHex = !isFirstHex; ch = this.nextChar(); } } + + // According to the PDF spec, section "7.3.4.3 Hexadecimal Strings": + // "If the final digit of a hexadecimal string is missing—that is, if there + // is an odd number of digits—the final digit shall be assumed to be 0." + if (firstDigit !== -1) { + strBuf.push(String.fromCharCode(firstDigit << 4)); + } return strBuf.join(""); } diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index af276cad181cd..98581ffbafbc0 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -564,6 +564,7 @@ !poppler-90-0-fuzzed.pdf !issue14415.pdf !issue14307.pdf +!issue18645.pdf !issue14497.pdf !bug1799927.pdf !issue14502.pdf diff --git a/test/pdfs/issue18645.pdf b/test/pdfs/issue18645.pdf new file mode 100644 index 0000000000000000000000000000000000000000..deb824088d455bb90ad8222ce7cf6513a052c80b GIT binary patch literal 22462 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"); const lexer = new Lexer(input); - expect(lexer.getHexString()).toEqual('p!U"$2'); + expect(lexer.getHexString()).toEqual('p!U"$2@'); }); });