diff --git a/src/core/jpg.js b/src/core/jpg.js index d9c49fa70..c6d0e83fd 100644 --- a/src/core/jpg.js +++ b/src/core/jpg.js @@ -163,12 +163,16 @@ var JpegImage = (function JpegImageClosure() { } else if (nextByte === /* EOI = */ 0xd9) { if (parseDNLMarker) { // NOTE: only 8-bit JPEG images are supported in this decoder. - const maybeScanLines = blockRow * 8; + const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0); // Heuristic to attempt to handle corrupt JPEG images with too // large `scanLines` parameter, by falling back to the currently - // parsed number of scanLines when it's at least one order of - // magnitude smaller than expected (fixes issue10880.pdf). - if (maybeScanLines > 0 && maybeScanLines < frame.scanLines / 10) { + // parsed number of scanLines when it's at least (approximately) + // one order of magnitude smaller than expected (fixes + // issue10880.pdf and issue10989.pdf). + if ( + maybeScanLines > 0 && + Math.round(frame.scanLines / maybeScanLines) >= 10 + ) { throw new DNLMarkerError( "Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", diff --git a/test/pdfs/issue10989.pdf.link b/test/pdfs/issue10989.pdf.link new file mode 100644 index 000000000..a06084eff --- /dev/null +++ b/test/pdfs/issue10989.pdf.link @@ -0,0 +1 @@ +https://github.com/mozilla/pdf.js/files/3410726/ArchitecturalPlanProblemPDF_2.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index c14626a8b..65c1b19dc 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -3746,6 +3746,14 @@ "lastPage": 7, "type": "eq" }, + { "id": "issue10989", + "file": "pdfs/issue10989.pdf", + "md5": "c16de154d9ae6dbeec0a113911957efe", + "rounds": 1, + "link": true, + "lastPage": 1, + "type": "eq" + }, { "id": "issue9650", "file": "pdfs/issue9650.pdf", "md5": "20d50bda6b1080b6d9088811299c791e",