From 4c54395ff69b2e89d0a2e94e33f96a5e7886989b Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Thu, 30 Jan 2020 13:13:51 +0100 Subject: [PATCH] Allow skipping of errors when reading broken/corrupt ToUnicode data (issue 11549) This will allow font loading/parsing to continue, rather than immediately failing, when broken/corrupt CMap data is encountered. --- src/core/cmap.js | 4 +- src/core/evaluator.js | 65 +++++++++++++++++++------------ test/pdfs/.gitignore | 1 + test/pdfs/issue11549_reduced.pdf | Bin 0 -> 25629 bytes test/test_manifest.json | 7 ++++ 5 files changed, 51 insertions(+), 26 deletions(-) create mode 100644 test/pdfs/issue11549_reduced.pdf diff --git a/src/core/cmap.js b/src/core/cmap.js index 3dd5f95fb..b43906537 100644 --- a/src/core/cmap.js +++ b/src/core/cmap.js @@ -996,7 +996,7 @@ var CMapFactory = (function CMapFactoryClosure() { } return { - create(params) { + async create(params) { var encoding = params.encoding; var fetchBuiltInCMap = params.fetchBuiltInCMap; var useCMap = params.useCMap; @@ -1015,7 +1015,7 @@ var CMapFactory = (function CMapFactoryClosure() { return parsedCMap; }); } - return Promise.reject(new Error("Encoding required.")); + throw new Error("Encoding required."); }, }; })(); diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 2f8a88126..344540143 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -2612,31 +2612,48 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { encoding: cmapObj, fetchBuiltInCMap: this.fetchBuiltInCMap, useCMap: null, - }).then(function(cmap) { - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xffff); - } - var map = new Array(cmap.length); - // Convert UTF-16BE - // NOTE: cmap can be a sparse array, so use forEach instead of for(;;) - // to iterate over all keys. - cmap.forEach(function(charCode, token) { - var str = []; - for (var k = 0; k < token.length; k += 2) { - var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - if ((w1 & 0xf800) !== 0xd800) { - // w1 < 0xD800 || w1 > 0xDFFF - str.push(w1); - continue; - } - k += 2; - var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); + }).then( + function(cmap) { + if (cmap instanceof IdentityCMap) { + return new IdentityToUnicodeMap(0, 0xffff); } - map[charCode] = String.fromCodePoint.apply(String, str); - }); - return new ToUnicodeMap(map); - }); + var map = new Array(cmap.length); + // Convert UTF-16BE + // NOTE: cmap can be a sparse array, so use forEach instead of + // `for(;;)` to iterate over all keys. + cmap.forEach(function(charCode, token) { + var str = []; + for (var k = 0; k < token.length; k += 2) { + var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); + if ((w1 & 0xf800) !== 0xd800) { + // w1 < 0xD800 || w1 > 0xDFFF + str.push(w1); + continue; + } + k += 2; + var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); + str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); + } + map[charCode] = String.fromCodePoint.apply(String, str); + }); + return new ToUnicodeMap(map); + }, + reason => { + if (reason instanceof AbortException) { + return null; + } + if (this.options.ignoreErrors) { + // Error in the ToUnicode data -- sending unsupported feature + // notification and allow font parsing to continue. + this.handler.send("UnsupportedFeature", { + featureId: UNSUPPORTED_FEATURES.font, + }); + warn(`readToUnicode - ignoring ToUnicode data: "${reason}".`); + return null; + } + throw reason; + } + ); } return Promise.resolve(null); }, diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index d55596365..c2392001c 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -352,6 +352,7 @@ !issue7878.pdf !font_ascent_descent.pdf !issue11442_reduced.pdf +!issue11549_reduced.pdf !issue8097_reduced.pdf !transparent.pdf !xobject-image.pdf diff --git a/test/pdfs/issue11549_reduced.pdf b/test/pdfs/issue11549_reduced.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e9e8ee66fa368544cffe24fd4dd0b81342b862e0 GIT binary patch literal 25629 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 Qaq)6