From 80342e2fdc36fc5d08c663f87c40e378417c4826 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 5 Nov 2019 11:52:30 +0100 Subject: [PATCH] Support UTF-16 little-endian strings in the `stringToPDFString` helper function (bug 1593902) The bug report seem to suggest that we don't support UTF-16 strings with a BOM (byte order mark), which we *actually* do as evident by both the code and a unit-test. The issue at play here is rather that we previously only supported big-endian UTF-16 BOM, and the `Title` string in the PDF document is using a *little-endian* UTF-16 BOM instead. Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1593902 --- src/shared/util.js | 6 ++++++ test/unit/util_spec.js | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/shared/util.js b/src/shared/util.js index 589bb4887..62c53a577 100644 --- a/src/shared/util.js +++ b/src/shared/util.js @@ -752,6 +752,12 @@ function stringToPDFString(str) { strBuf.push(String.fromCharCode( (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1))); } + } else if (str[0] === '\xFF' && str[1] === '\xFE') { + // UTF16LE BOM + for (let i = 2; i < length; i += 2) { + strBuf.push(String.fromCharCode( + (str.charCodeAt(i + 1) << 8) | str.charCodeAt(i))); + } } else { for (let i = 0; i < length; ++i) { const code = PDFStringTranslateTable[str.charCodeAt(i)]; diff --git a/test/unit/util_spec.js b/test/unit/util_spec.js index cd2c9724d..ce1f0c21e 100644 --- a/test/unit/util_spec.js +++ b/test/unit/util_spec.js @@ -179,11 +179,16 @@ describe('util', function() { expect(stringToPDFString(str)).toEqual('\u201Cstring\u201D'); }); - it('handles UTF-16BE strings', function() { + it('handles UTF-16 big-endian strings', function() { let str = '\xFE\xFF\x00\x73\x00\x74\x00\x72\x00\x69\x00\x6E\x00\x67'; expect(stringToPDFString(str)).toEqual('string'); }); + it('handles UTF-16 little-endian strings', function() { + let str = '\xFF\xFE\x73\x00\x74\x00\x72\x00\x69\x00\x6E\x00\x67\x00'; + expect(stringToPDFString(str)).toEqual('string'); + }); + it('handles empty strings', function() { // ISO Latin 1 let str1 = ''; @@ -192,6 +197,10 @@ describe('util', function() { // UTF-16BE let str2 = '\xFE\xFF'; expect(stringToPDFString(str2)).toEqual(''); + + // UTF-16LE + let str3 = '\xFF\xFE'; + expect(stringToPDFString(str3)).toEqual(''); }); });