Allow over-writing entries, in XRef.indexObjects, only when the generation number matches (issues 11230, 11139, 9552, 9129, 7303)

This patch is making me somewhat worried about future regressions, since it's certainly easy to imagine this completely breaking certain kinds of corrupt/edited PDF documents while fixing others.[1]

Obviously it passes all existing reference tests (and even improves one), however compared to many other patches there's no telling how much it could break.
The only reason that I'm even submitting this patch, is because of the number of open issues that it would address.

Generally speaking though, the best course of action would probably be if `XRef.indexObjects` was re-written to be much more robust (since it currently feels somewhat hand-wavy in parts). E.g. by actually checking/validating more of the objects before committing to them.

---
[1] Especially given that it's reverting part of PR 5910, however in the case of issue 5909 it seems that other (more recent) changes have actually made that PR redundant.
This commit is contained in:
Jonas Jenwald 2019-10-11 20:39:02 +02:00
parent 16ae7c6960
commit ffc847eaa5
7 changed files with 49 additions and 1 deletions

View File

@ -1415,7 +1415,7 @@ var XRef = (function XRefClosure() {
position += skipUntil(buffer, position, startxrefBytes);
} else if ((m = objRegExp.exec(token))) {
const num = m[1] | 0, gen = m[2] | 0;
if (typeof this.entries[num] === 'undefined') {
if (!this.entries[num] || this.entries[num].gen === gen) {
this.entries[num] = {
offset: position - stream.start,
gen,

View File

@ -0,0 +1 @@
https://github.com/mozilla/pdf.js/files/3602024/FR.Cekada.SedesUnCum.pdf

View File

@ -0,0 +1 @@
https://github.com/mozilla/pdf.js/files/3717821/Y._Tsividis_A_First_Lab_in_Circuits_and_Electronics.pdf

View File

@ -0,0 +1 @@
https://github.com/mozilla/pdf.js/files/254710/ws_protectyourwork_e.pdf

View File

@ -0,0 +1 @@
https://github.com/mozilla/pdf.js/files/3721643/issue9129.pdf

View File

@ -0,0 +1 @@
https://github.com/mozilla/pdf.js/files/3721640/issue9552.pdf

View File

@ -1378,14 +1378,40 @@
"rounds": 1,
"type": "eq"
},
{ "id": "issue7303",
"file": "pdfs/issue7303.pdf",
"md5": "3a5a4ab6755d6c3b0c490996b83d69d2",
"link": true,
"rounds": 1,
"lastPage": 2,
"type": "eq"
},
{ "id": "issue7496",
"file": "pdfs/issue7496.pdf",
"md5": "b422981ae781166e75c0fb4c3634ed96",
"link": true,
"rounds": 1,
"lastPage": 2,
"type": "eq",
"annotations": true
},
{ "id": "issue9129",
"file": "pdfs/issue9129.pdf",
"md5": "939ffc8d6d29b1d74e9d0f98b227b97f",
"link": true,
"rounds": 1,
"lastPage": 1,
"type": "eq"
},
{ "id": "issue9552",
"file": "pdfs/issue9552.pdf",
"md5": "7f80fd5b426926f88fd2a9fdc02cd3bd",
"link": true,
"rounds": 1,
"lastPage": 1,
"type": "eq",
"annotations": true
},
{ "id": "issue10326",
"file": "pdfs/issue10326.pdf",
"md5": "015c13b09ef735ea1204f38992c60487",
@ -1394,6 +1420,23 @@
"lastPage": 1,
"type": "eq"
},
{ "id": "issue11139",
"file": "pdfs/issue11139.pdf",
"md5": "006dd4f4bb1878bc14a12072d81a4524",
"link": true,
"rounds": 1,
"lastPage": 1,
"type": "eq"
},
{ "id": "issue11230",
"file": "pdfs/issue11230.pdf",
"md5": "db0a1464d8f9f3ce079b52e0cacdccd3",
"link": true,
"rounds": 1,
"firstPage": 100,
"lastPage": 100,
"type": "eq"
},
{ "id": "issue7544",
"file": "pdfs/issue7544.pdf",
"md5": "87e3a9fc7d6a6c1bd5b53af6926ce48e",