diff --git a/src/core/cff_parser.js b/src/core/cff_parser.js index d2beed37c..2a9f3cb0e 100644 --- a/src/core/cff_parser.js +++ b/src/core/cff_parser.js @@ -995,6 +995,11 @@ var CFFDict = (function CFFDictClosure() { // remove the array wrapping these types of values if (type === 'num' || type === 'sid' || type === 'offset') { value = value[0]; + // Ignore invalid values (fixes bug 1068432). + if (isNaN(value)) { + warn('Invalid CFFDict value: ' + value + ', for key: ' + key + '.'); + return true; + } } this.values[key] = value; return true; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index ba364de32..e2a366caa 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -36,6 +36,7 @@ !bug1020858.pdf !bug1050040.pdf !bug1200096.pdf +!bug1068432.pdf !issue5564_reduced.pdf !canvas.pdf !bug1132849.pdf diff --git a/test/pdfs/bug1068432.pdf b/test/pdfs/bug1068432.pdf new file mode 100644 index 000000000..da128bbab Binary files /dev/null and b/test/pdfs/bug1068432.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index 372db8416..545fc076a 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -203,6 +203,13 @@ "lastPage": 1, "type": "eq" }, + { "id": "bug1068432", + "file": "pdfs/bug1068432.pdf", + "md5": "b76ac8d7d0ef471f28535c881f421e33", + "rounds": 1, + "link": false, + "type": "eq" + }, { "id": "issue1512", "file": "pdfs/issue1512r.pdf", "md5": "af48ede2658d99cca423147085c6609b", diff --git a/test/unit/cff_parser_spec.js b/test/unit/cff_parser_spec.js index a0e8cf2be..67594d3f3 100644 --- a/test/unit/cff_parser_spec.js +++ b/test/unit/cff_parser_spec.js @@ -95,6 +95,15 @@ describe('CFFParser', function() { expect(topDict.getByName('Private')).toEqual([45, 102]); }); + it('refuses to add topDict key with invalid value (bug 1068432)', + function () { + var topDict = cff.topDict; + var defaultValue = topDict.getByName('UnderlinePosition'); + + topDict.setByKey(/* [12, 3] = */ 3075, [NaN]); + expect(topDict.getByName('UnderlinePosition')).toEqual(defaultValue); + }); + it('parses a CharString having cntrmask', function() { var bytes = new Uint8Array([0, 1, // count 1, // offsetSize