Prevent an infinite loop in XRef.readXRef by keeping track of already parsed tables (bug 1393476)

With this patch, not only is the infinite loop prevented, but we're also able to actually render the file (which e.g. Adobe Reader isn't able to).

Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1393476.
This commit is contained in:
Jonas Jenwald 2017-08-24 19:14:33 +02:00
parent e9ba54940d
commit 4660cf8238
3 changed files with 19 additions and 0 deletions

View File

@ -1186,11 +1186,22 @@ var XRef = (function XRefClosure() {
readXRef: function XRef_readXRef(recoveryMode) {
var stream = this.stream;
// Keep track of already parsed XRef tables, to prevent an infinite loop
// when parsing corrupt PDF files where e.g. the /Prev entries create a
// circular dependency between tables (fixes bug1393476.pdf).
let startXRefParsedCache = Object.create(null);
try {
while (this.startXRefQueue.length) {
var startXRef = this.startXRefQueue[0];
if (startXRefParsedCache[startXRef]) {
warn('readXRef - skipping XRef table since it was already parsed.');
this.startXRefQueue.shift();
continue;
}
startXRefParsedCache[startXRef] = true;
stream.pos = startXRef + stream.start;
var parser = new Parser(new Lexer(stream), true, this);

View File

@ -0,0 +1 @@
https://bugzilla.mozilla.org/attachment.cgi?id=8900754

View File

@ -820,6 +820,13 @@
"link": false,
"type": "eq"
},
{ "id": "bug1393476",
"file": "pdfs/bug1393476.pdf",
"md5": "163ee8727c77f27ee651eec777bb20a9",
"rounds": 1,
"link": true,
"type": "eq"
},
{ "id": "bug1252420",
"file": "pdfs/bug1252420.pdf",
"md5": "f21c911b9b655972b06ef782a1fa6a17",