Browse Source

Consume the current character when encountering illegal characters in `Lexer.getObject`, in order to prevent infinite loops during reading of streams (issue 8061)

*Please note:* The rendering of the PDF file in issue 8061 first regressed in PR 7039, and then PR 7493 exacerbated the problem even further by causing an infinite loop.

In this particular case, when errors were encountered inside of the `Lexer.getObject` method *itself*, we didn't advance the stream position. This thus caused an inifinite loop in `parseCMap`, since the exact same character was then parsed over and over again.

Fixes 8061.
Jonas Jenwald 8 years ago
parent
commit
23c62cc321
  1. 5
      src/core/parser.js
  2. 1
      test/pdfs/.gitignore
  3. BIN
      test/pdfs/issue8061.pdf
  4. 7
      test/test_manifest.json

5
src/core/parser.js

@ -1013,6 +1013,11 @@ var Lexer = (function LexerClosure() { @@ -1013,6 +1013,11 @@ var Lexer = (function LexerClosure() {
this.nextChar();
return Cmd.get('}');
case 0x29: // ')'
// Consume the current character in order to avoid permanently hanging
// the worker thread if `Lexer.getObject` is called from within a loop
// containing try-catch statements, since we would otherwise attempt
// to parse the *same* character over and over (fixes issue8061.pdf).
this.nextChar();
error('Illegal character: ' + ch);
break;
}

1
test/pdfs/.gitignore vendored

@ -45,6 +45,7 @@ @@ -45,6 +45,7 @@
!issue7855.pdf
!issue7872.pdf
!issue7901.pdf
!issue8061.pdf
!bad-PageLabels.pdf
!filled-background.pdf
!ArabicCIDTrueType.pdf

BIN
test/pdfs/issue8061.pdf

Binary file not shown.

7
test/test_manifest.json

@ -1712,6 +1712,13 @@ @@ -1712,6 +1712,13 @@
"link": false,
"type": "eq"
},
{ "id": "issue8061",
"file": "pdfs/issue8061.pdf",
"md5": "d61fe1dcdcd55bca00b351b2fc2c6dc7",
"rounds": 1,
"link": false,
"type": "eq"
},
{ "id": "issue7580-eq",
"file": "pdfs/issue7580.pdf",
"md5": "44dd5a9b4373fcab9890cf567722a766",

Loading…
Cancel
Save