From 1bbc694ac3ce7d949f1ad520abed40bdbd0fe04b Mon Sep 17 00:00:00 2001 From: Jonas Jenwald 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 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 zcmb7p2Ut^Gv+fR|h88+VF?2+Fm)<)_4^?Ra5;}<}f(VEpO=&@jbU{!+dXXX^pcFv_ z1QBUcM38C$Q8+t%>i<3GoO_>p_uk1$X5LwAX4b5-*YKNZ>xxQ>$;0>;Ka7mQBoPt_ ze^(3wrmPGTH*@hsVG&Xw$pR*B6%v3#h-?HwB5SHh4L;bG( z!HJy!b*x~7SolX@#NV(W^u%A&kZ5;;Wl{<-aZNN1YlaHa^7jq!_ak&TNYh85J-xs{ zA@H?Ppbt?92SOzN{($}d*V6_BjX~ScJ_Mb_wY9AN5rB#RcAuP#yu=@O{|*mAm;3k! zSq6aCfFh`1v>VDoPxD`1KAt+B2jGUf2D$(Q0s-{F8#wL;=*WQxAOZ@Z1BmD#P&&wQ z55Nfk5E2jr0sdZ45>hg9VhSPxo1MTRg8qvO!bypU$)LyY04)GYL_~PNix_-J$Vo_u ziAi8&WTfO&Fe)la7$qe&4LzKihK`1k63z^#V_;-rVxppDVP$4yrDtSfBvb-{f-=M; z6eJ`RjMS9WjQ`))@iagMYDff!!a-vu1jJ*A?2Y0s8Bu7w(Y;kjcPoyLr|+<8k45L4 z5O59lI`-TSWH)TAe2p_Q*)=X50M4O_wGGphT!TAeY}qWN>k9y2aDWFO3$r(B+n^d@ zyKM#lsAW0;(kFJq_myYc8@#~<&{^+2**Ebkkhh{4m>JXOb330`Igf!(ENSkB=|#V^ z=boIW*OpgXd`;V)Z8G1!tdqC;)%5J!k_K9%&BIHs`x~Dt>%0_OZRhUqZ*2O_wb3L_ zwo{}%N?%*uZfvAgtJuzY+Ov$?nDuz-zuFrrqnh@qOKxbLfupMBe*K6=+K0N9*6?lR z*3wY^*sQS+Dje?{szZKxM!$dkVffSAwwK|n{Rs>BQrXjnwQ|&A{0UQBN>@H7-FW8? zwiYngMw;90_uX$~h3&if*A<#l`w;vDhw6JHq)I{EOkU9Fue7gxZ#npoYf+{(JEx{k}wRseu~;9tW$3v1rNB@i z2Ll#DLR7xCEN2vx-$AK`c~@&CSMxy&Q>QqtypWj9`9gEedQ6L+KXGwXF}qKNp@L^Y z`_sX}sAB5A$rH%*Qn7@OIqIqlXLeE$ z?}BpJe44uO9aNRuDE}L0!`SRTL8g}Of9w@+PpI5*@^@WlLnG@isHVL`a4*jCt1P@n zA^UqT3Q~!h^&Faq-*kD;c3qq)>>mBD-q=RXrGWGGo=jo6BDX_qcrPAk4G3RLdD5}w zoqaQ(5$E%$BtuzDZ6Y_ed&0*T)5wNW*W++pD>lrPMy8CeObV+RPQ!}7MD%>zHyXSI z

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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",