Add a recoveryMode that suppresses errors from the Parser, and utilize it when searching for the main trailer in XRef_indexObjects (bug 1250079)

Instead of having `Parser_getObj` fail unconditionally for the referenced PDF file, this patch attempts to let searching for the main trailer continue even if there are errors.

Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1250079.
This commit is contained in:
Jonas Jenwald 2016-02-24 17:56:28 +01:00
parent 94089960c0
commit 544d29f5cb
5 changed files with 22 additions and 5 deletions

View File

@ -970,13 +970,15 @@ var XRef = (function XRefClosure() {
var dict;
for (i = 0, ii = trailers.length; i < ii; ++i) {
stream.pos = trailers[i];
var parser = new Parser(new Lexer(stream), true, this);
var parser = new Parser(new Lexer(stream), /* allowStreams = */ true,
/* xref = */ this, /* recoveryMode = */ true);
var obj = parser.getObj();
if (!isCmd(obj, 'trailer')) {
continue;
}
// read the trailer dictionary
if (!isDict(dict = parser.getObj())) {
dict = parser.getObj();
if (!isDict(dict)) {
continue;
}
// taking the first one with 'ID'

View File

@ -66,10 +66,11 @@ function isEOF(v) {
var MAX_LENGTH_TO_CACHE = 1000;
var Parser = (function ParserClosure() {
function Parser(lexer, allowStreams, xref) {
function Parser(lexer, allowStreams, xref, recoveryMode) {
this.lexer = lexer;
this.allowStreams = allowStreams;
this.xref = xref;
this.recoveryMode = recoveryMode || false;
this.imageCache = Object.create(null);
this.refill();
}
@ -115,7 +116,10 @@ var Parser = (function ParserClosure() {
array.push(this.getObj(cipherTransform));
}
if (isEOF(this.buf1)) {
error('End of file inside array');
if (!this.recoveryMode) {
error('End of file inside array');
}
return array;
}
this.shift();
return array;
@ -136,7 +140,10 @@ var Parser = (function ParserClosure() {
dict.set(key, this.getObj(cipherTransform));
}
if (isEOF(this.buf1)) {
error('End of file inside dictionary');
if (!this.recoveryMode) {
error('End of file inside dictionary');
}
return dict;
}
// Stream objects are not allowed inside content streams or

View File

@ -99,6 +99,7 @@
!bug911034.pdf
!bug1108301.pdf
!bug1157493.pdf
!bug1250079.pdf
!pdfjsbad1586.pdf
!freeculture.pdf
!issue6006.pdf

BIN
test/pdfs/bug1250079.pdf Normal file

Binary file not shown.

View File

@ -730,6 +730,13 @@
"link": false,
"type": "eq"
},
{ "id": "bug1250079",
"file": "pdfs/bug1250079.pdf",
"md5": "a1dd21a70ae7097d96273e85a80b26ef",
"rounds": 1,
"link": false,
"type": "load"
},
{ "id": "hudsonsurvey",
"file": "pdfs/hudsonsurvey.pdf",
"md5": "bf0e6576a7b6c2fe7485bce1b78e006f",