From 1bbc694ac3ce7d949f1ad520abed40bdbd0fe04b Mon Sep 17 00:00:00 2001 From: Jonas Jenwald <jonas.jenwald@gmail.com> Date: Mon, 13 Jun 2016 13:29:32 +0200 Subject: [PATCH 1/2] Assign the `quantizationTables` after parsing the entire JPEG image, to prevent issues when the DQT (Define Quantization Tables) marker is encountered after SOF{n} (Start of Frame) markers (issue 7406) This is a tentative patch that fixes 7406. --- src/core/jpg.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/core/jpg.js b/src/core/jpg.js index be6840479..4bb326635 100644 --- a/src/core/jpg.js +++ b/src/core/jpg.js @@ -387,6 +387,10 @@ var JpegImage = (function jpegImage() { var p0, p1, p2, p3, p4, p5, p6, p7; var t; + if (!qt) { + throw 'missing required Quantization Table.'; + } + // inverse DCT on rows for (var row = 0; row < 64; row += 8) { // gather block data @@ -738,7 +742,8 @@ var JpegImage = (function jpegImage() { l = frame.components.push({ h: h, v: v, - quantizationTable: quantizationTables[qId] + quantizationId: qId, + quantizationTable: null, // See comment below. }); frame.componentIds[componentId] = l - 1; offset += 3; @@ -822,6 +827,15 @@ var JpegImage = (function jpegImage() { this.components = []; for (i = 0; i < frame.components.length; i++) { component = frame.components[i]; + + // Prevent errors when DQT markers are placed after SOF{n} markers, + // by assigning the `quantizationTable` entry after the entire image + // has been parsed (fixes issue7406.pdf). + var quantizationTable = quantizationTables[component.quantizationId]; + if (quantizationTable) { + component.quantizationTable = quantizationTable; + } + this.components.push({ output: buildComponentData(frame, component), scaleX: component.h / frame.maxH, From 3ac23200ba346840364311f7df241fbc67171ef8 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald <jonas.jenwald@gmail.com> Date: Sat, 23 Jul 2016 13:04:27 +0200 Subject: [PATCH 2/2] Add a reduced test-case for issue 7406 The PDF file contains an image that we're allowed to use, since it's just the PDF.js logo. The logo image was simply inverted (so that it requires a /Decode entry in the image dictionary that triggers the use of `jpg.js` instead of the browser), converted to JPEG, and finally edited by hand to change the order of the DQT/SOF{n} markers. --- test/pdfs/.gitignore | 1 + test/pdfs/issue7406.pdf | Bin 0 -> 7468 bytes test/test_manifest.json | 7 +++++++ 3 files changed, 8 insertions(+) create mode 100644 test/pdfs/issue7406.pdf diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index ff1f009f9..72c0ca28c 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -30,6 +30,7 @@ !issue7200.pdf !issue7229.pdf !issue7403.pdf +!issue7406.pdf !issue7426.pdf !issue7439.pdf !issue7446.pdf diff --git a/test/pdfs/issue7406.pdf b/test/pdfs/issue7406.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1c1d07d8275611a9100c5e4a291dc40042980788 GIT binary patch literal 7468 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 literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index dc0498774..579189daa 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -976,6 +976,13 @@ "rounds": 1, "type": "eq" }, + { "id": "issue7406", + "file": "pdfs/issue7406.pdf", + "md5": "7a3d322d7c595a36b4470cfb6a54a2b7", + "link": false, + "rounds": 1, + "type": "eq" + }, { "id": "protectip", "file": "pdfs/protectip.pdf", "md5": "676e7a7b8f96d04825361832b1838a93",