diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java index 94a08464..f84833da 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java @@ -319,6 +319,19 @@ public class JPEGImageReader extends ImageReaderBase { ICC_Profile profile = getEmbeddedICCProfile(false); AdobeDCTSegment adobeDCT = getAdobeDCT(); SOFSegment sof = getSOF(); + + if (adobeDCT != null && (adobeDCT.getTransform() == AdobeDCTSegment.YCC && sof.componentsInFrame() != 3 || + adobeDCT.getTransform() == AdobeDCTSegment.YCCK && sof.componentsInFrame() != 4)) { + processWarningOccurred(String.format( + "Invalid Adobe App14 marker. Indicates %s data, but SOF%d has %d color components. " + + "Ignoring Adobe App14 marker.", + adobeDCT.getTransform() == AdobeDCTSegment.YCCK ? "YCCK/CMYK" : "YCC/RGB", + sof.marker & 0xf, sof.componentsInFrame() + )); + + adobeDCT = null; + } + JPEGColorSpace sourceCSType = getSourceCSType(getJFIF(), adobeDCT, sof); // We need to apply ICC profile unless the profile is sRGB/default gray (whatever that is) @@ -335,7 +348,7 @@ public class JPEGImageReader extends ImageReaderBase { } // TODO: Possible to optimize slightly, to avoid readAsRaster for non-CMyK and other good types? - return readImageAsRasterAndReplaceColorProfile(imageIndex, param, sof, sourceCSType, adobeDCT, ensureDisplayProfile(profile)); + return readImageAsRasterAndReplaceColorProfile(imageIndex, param, sof, sourceCSType, ensureDisplayProfile(profile)); } if (DEBUG) { @@ -345,7 +358,7 @@ public class JPEGImageReader extends ImageReaderBase { return delegate.read(imageIndex, param); } - private BufferedImage readImageAsRasterAndReplaceColorProfile(int imageIndex, ImageReadParam param, SOFSegment startOfFrame, JPEGColorSpace csType, AdobeDCTSegment adobeDCT, ICC_Profile profile) throws IOException { + private BufferedImage readImageAsRasterAndReplaceColorProfile(int imageIndex, ImageReadParam param, SOFSegment startOfFrame, JPEGColorSpace csType, ICC_Profile profile) throws IOException { int origWidth = getWidth(imageIndex); int origHeight = getHeight(imageIndex); @@ -366,27 +379,16 @@ public class JPEGImageReader extends ImageReaderBase { else if (intendedCS != null) { // Handle inconsistencies if (startOfFrame.componentsInFrame() != intendedCS.getNumComponents()) { - if (startOfFrame.componentsInFrame() < 4 && (csType == JPEGColorSpace.CMYK || csType == JPEGColorSpace.YCCK)) { - processWarningOccurred(String.format( - "Invalid Adobe App14 marker. Indicates YCCK/CMYK data, but SOF%d has %d color components. " + - "Ignoring Adobe App14 marker, assuming YCbCr/RGB data.", - startOfFrame.marker & 0xf, startOfFrame.componentsInFrame() - )); + // If ICC profile number of components and startOfFrame does not match, ignore ICC profile + processWarningOccurred(String.format( + "Embedded ICC color profile is incompatible with image data. " + + "Profile indicates %d components, but SOF%d has %d color components. " + + "Ignoring ICC profile, assuming source color space %s.", + intendedCS.getNumComponents(), startOfFrame.marker & 0xf, startOfFrame.componentsInFrame(), csType + )); - csType = JPEGColorSpace.YCbCr; - } - else { - // If ICC profile number of components and startOfFrame does not match, ignore ICC profile - processWarningOccurred(String.format( - "Embedded ICC color profile is incompatible with image data. " + - "Profile indicates %d components, but SOF%d has %d color components. " + - "Ignoring ICC profile, assuming source color space %s.", - intendedCS.getNumComponents(), startOfFrame.marker & 0xf, startOfFrame.componentsInFrame(), csType - )); - - if (csType == JPEGColorSpace.CMYK && image.getColorModel().getColorSpace().getType() != ColorSpace.TYPE_CMYK) { - convert = new ColorConvertOp(ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK), image.getColorModel().getColorSpace(), null); - } + if (csType == JPEGColorSpace.CMYK && image.getColorModel().getColorSpace().getType() != ColorSpace.TYPE_CMYK) { + convert = new ColorConvertOp(ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK), image.getColorModel().getColorSpace(), null); } } // NOTE: Avoid using CCOp if same color space, as it's more compatible that way @@ -510,6 +512,10 @@ public class JPEGImageReader extends ImageReaderBase { } static JPEGColorSpace getSourceCSType(JFIFSegment jfif, AdobeDCTSegment adobeDCT, final SOFSegment startOfFrame) throws IIOException { + if (startOfFrame == null) { + throw new IIOException("No SOF segment in stream"); + } + /* ADAPTED from http://download.oracle.com/javase/6/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html: @@ -554,9 +560,15 @@ public class JPEGImageReader extends ImageReaderBase { switch (adobeDCT.getTransform()) { case AdobeDCTSegment.YCC: // TODO: Verify that startOfFrame has 3 components, otherwise issue warning and ignore adobeDCT + if (startOfFrame.components.length != 3) { + break; + } return JPEGColorSpace.YCbCr; case AdobeDCTSegment.YCCK: // TODO: Verify that startOfFrame has 4 components, otherwise issue warning and ignore adobeDCT + if (startOfFrame.components.length != 4) { + break; + } return JPEGColorSpace.YCCK; case AdobeDCTSegment.Unknown: if (startOfFrame.components.length == 1) { @@ -1052,7 +1064,19 @@ public class JPEGImageReader extends ImageReaderBase { @Override public IIOMetadata getImageMetadata(int imageIndex) throws IOException { - IIOMetadata imageMetadata = delegate.getImageMetadata(imageIndex); + // TMI-101: As we catch the IndexOutOfBoundsException below, we need to make sure that we don't catch the + // IndexOutOfBoundsException that should be thrown, if (imageIndex < 0 || imageIndex > numImages). + checkBounds(imageIndex); + + IIOMetadata imageMetadata; + + try { + imageMetadata = delegate.getImageMetadata(imageIndex); + } + catch (IndexOutOfBoundsException knownIssue) { + // TMI-101: com.sun.imageio.plugins.jpeg.JPEGBuffer doesn't do proper sanity check of input data. + throw new IIOException("Corrupt JPEG data: Bad segment offset/length", knownIssue); + } if (imageMetadata != null && Arrays.asList(imageMetadata.getMetadataFormatNames()).contains(JPEGImage10MetadataCleaner.JAVAX_IMAGEIO_JPEG_IMAGE_1_0)) { if (metadataCleaner == null) { @@ -1369,9 +1393,16 @@ public class JPEGImageReader extends ImageReaderBase { // int sub = 4; // param.setSourceSubsampling(sub, sub, 0, 0); // } + BufferedImage image = reader.getImageTypes(0).next().createBufferedImage(reader.getWidth(0), reader.getHeight(0)); + param.setDestination(image); // long start = System.currentTimeMillis(); - BufferedImage image = reader.read(0, param); + try { + image = reader.read(0, param); + } + catch (IOException e) { + e.printStackTrace(); + } // System.err.println("Read time: " + (System.currentTimeMillis() - start) + " ms"); // System.err.println("image: " + image); @@ -1380,8 +1411,6 @@ public class JPEGImageReader extends ImageReaderBase { int maxW = 1280; int maxH = 800; -// int maxW = 400; -// int maxH = 400; if (image.getWidth() > maxW || image.getHeight() > maxH) { // start = System.currentTimeMillis(); float aspect = reader.getAspectRatio(0); diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java index 5ac66430..23c02566 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java @@ -94,6 +94,16 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase getBrokenTestData() { + return Arrays.asList( + new TestData(getClassLoaderResource("/jpeg/broken-bogus-segment-length.jpg"), new Dimension(467, 612)), + new TestData(getClassLoaderResource("/jpeg/broken-adobe-marker-bad-length.jpg"), new Dimension(1800, 1200)), + new TestData(getClassLoaderResource("/jpeg/broken-invalid-adobe-ycc-gray.jpg"), new Dimension(11, 440)) + ); + + // More test data in specific tests below + } + @Override protected ImageReaderSpi createProvider() { return SPI; @@ -396,7 +406,120 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCases#s؃Lz򿖴Ml `20C*6h(d"?F+Y|?Rn@NEi?P\c lù$%T^%" MXnISڇ"Cvm"쟻8*Cpifs;=b&e%U'ΝB0N،XvsZhr»Z̬ly^?:̶P7 {AuB}b8y{RQ, C'59ER&om' dZdyDlF~-OՑ_HN ?Kf^ȣ +R4X`Nz=GjGˍ +gC\k66WmqJ6Hˬa'](E JFu2'R?H}!F<ɢ>XWl1իbNˠ[=@8`sͷXNhH 8e `P:p#n +{1H&UZ tlM`$ņء QA\\RD-ZOAlUҎG*blgE,!(! bʇ;⨲p;704D4;`5g*r=[;],5\+\YVW bE3ezlU,SD1E  /Qؼr C1T;A-fMRAloKpF 螸l. ] .[SHPhAsx/rko G;/?Wٓ& |Ak0~3a4gj9y'V6] H>Gj[q ~qE\ϼU?͖JLqn>H{A *׿.3F$z5++*[SYXSIRBP Pr WbKU#*`Gi2c9Dr}t91n@[}jkY玧bW4>i_m!䮀/? ;FfR=/4B RelI=?wd/Ġl EkЩ 0X6six%!!.?sWMgf1 G pv(oK-/ྏԁ8(i86NIkT*1k?8\D1rqS_3& 4 5#dZmJ2<W,!t D+8=|e`)cҮY" "^eZpȮ9ޅk9sɫ)dXKk"HLiRVv x5?Ho.Y.[P n4-.$& $ہ=>if1Gq(qIB no$=ʸHCF84KA?Tx\zZB, ;mđHAV}LNQtVm\8>+ ̞?BT>^YCo,eUP66+\Uzz1tU6xؾ.\PN6A):nU +I ={oլ<󪎴7s{w. +1hc$oHӈ [/FeL̅'G4Lxr-5eXwܪჄ>L.?w#W֜%,>Q^aaq$/v +gO6YB)ene$n_̘1÷UHt>BGoî;Q 4˾FgZ=Ԛd +m3o/˻''KTZ! ƾM%> v !̧&-&p&yޓ?w-ծth~ +H+.|nb,q4ӧa–,kO 2и 嘏pL/s2f4 } RHLR*'0"OZ*; -52PeaU&N2܍~U=FAO9FROd ] E­;Tԁhb"PIzVU-N gHsz^ b۝5>]Mwh d_Yrw3[ڮqJtQ$ZE$(*yFzt*F' VDqU;a`#>Axb`9I` d H Fu#;, L/b?qc*3;SaE] +H +/#8ZU75׎G-Ep+ )VvWۦZ + +NB*ND ec\$p P)1]*9YyVW6lUxuڙfW\N*N8blqT\1qqTLr7 R{i 02llUrsI$vbPG@9UY"z3O/}Gf4 ܿ I-9՞V~V7n 4cɺ($J|(Kx ]Gykap0%4oݏolZhQ* 9g$_+:l&k18.D\c]iUMY[O* ~##y~([~ aKgVUN | WLgW'FO/0Y~-To7lyrI,Gv9qPl3K0Irkҧ ˜/1ݙ)k0S+ EWHMٹ$xS0BՒLA 9QYi3Bjo#껫לwy=IT#r}ϥ1$zqCFGq +B`:' m+5Ef)2_j6F#⨂:FjF[ V.@pvQ.Xǟw{)55댔i"Uͽoc\ # 30GwNJɳv}+M #/}0eѻKLj=0dQg R4B +( 2r߫Î8ǂ >+`;/6S`a$%Dr!NcbB 3W=\MB^IfU}>;/b"6۸ř# + aL{?lIJ;"ߌcxOc}6Kе[د$~8pbj{6خ'8ogS%A0 "jᅮ$`ò3R.6=pOP)U۩ d%{;^qiq_N,k\Bg&$>8jRLad=;FacrO\M9f*]vlٱV8 hR\sb͊Q]͔tT \qsf*™YlwW1jcXu8Ɓʒ>pBe,r3E~TYVIMi 6Jof AatQ|rIk|!Fwe+J 'h.!1 m(j-dxZ%Pi`[2^J,SNkK4;vY;YH C[FLyYD,Jeo/UFݞ$:.

~Mq#x!Uk2ci?!4OP2bœ/{+kh +I8;ƒ 0@ {9I&o6j~e6%lXҮ/-iF"zL3N<1+~i570*za:JVp&$UFNO6)}T$6᧎cdv~G{v; pZHSb$Wn:d&N-zS2WR*q27-@1o2qi)+'⫭iX׹ΓګRG\yv4r\aUcNBN{gb81uz; +m{1-#j7aί!%A-~<$A39fw<@;-|Q?)于BrV Aû NEjփݭqYPu?+sL1(csПޑP5TE@G\9|s(1Q5ġ+@N *nck%~2M@Fw=q/Qс޸Y$N&:[H# 8؂1 . LuNv$[w^ApHv8wb  ]>8Ǫ @{s:8y ?B n-ýqC 9S52T'iWD,d`bPb.`$ 4\UI1leqUg/(S6_lت |Uces@caMTtm,:W +6;)1)ZRNh(Ōs''Kvn1 +EPCb'oRqXkl /!&> +SnfZQtp:YHi>¸}C/A8vY .Ks IПJ}rL`45g`5́du0?P*2-[ާlL}x7F"\-U1~>Tpqk4;0_B3 52cGCޣl e(Dd OL{Tヲ S ` W4POцVm4`|(7 1Fk6":_#ՉĚ )6`Ol[cH(fڻ+2 f}e%ccjy@£|losUqlW ` l !8邚gp0:^lzkWő;w Rk\5ijpLADGpჅ**֫ #qu.i"_!LX: !0*~}F/NEcO0K}CFV;, 9pZGJJRSR +ڻ^87Ŋal $$  >A'V)6X'¸lwʙTYm={సUP,f#, Uz{q4+"4~c)j'3 FDM0ta4 pxh:" FT&|HqJ;!'~ehVaYnU]01l2@&D#Iվ$z* *q9GQ[XD&oi6w1 +Jl9g+)6Ya$)ø i׾16JseÖ\xbx{]B"( J݉QJincQ eKyl *Dza2*lw֤!̦R\Yi<-\R6SDrqfzQF8 Tb@c q07+`"9@!ӯUǦJ3I8vf!Cx8uċLbԍ4B :e f[Vsm/S!͟ @2܎IQ8<~a=}@)S<&E01HmVr@$ 1+x6"ʋ 25 r=pdP-㌱悐rofHGL7dr^3ö Zbl-#o)Ԋ ..\dmԧND5b %JFArq/3rPngeD2t2Z""8co"+hqtzwS2\ -߆ii+nFG[lMTs+*S|UV*CS׾*͎ԧlث\|BMlMqU;啮<)(6(8eD9F=\1/-:X2QrK3xa_Pԕ棨' ܋:m z)9)krN'j#bD㕋 wGd@c=0@^N1`g V@~sj ke4P~ˏJ3nẋW +jc-,\yrqXP= +\t:1Oڪ.^D :3E '$Apʼn#Tt tdO42pі@+EpMޛP3D!NOэo)O) ,K4&2V%HO}=P`Y-{aA,e --i$`Ӹ Vq 2" +ćCH +C% z%0 1_miIO㙵kf 8ND:ɒ\P#4pqR:⋣ԨrLRb)}AB0z H$C `X.(6K8nj@s%iM,*y  p\EGR;q/ri;4e6r--KY_;C^6N(b1V8ĕqdp0s.F1'm3ǕcDl~"2DƪbZ>, yw];c2|hsa ļK2RF5XI|p+uƽ:agwa!YmH+/lUUWs5q OA_/qKIp#jc3k0~1 mcz`1w2lqwnpLq@r@N$ё=04nukw +dec-!vbӟM Gۤ˜dY/s_"kʶ(IŬZϩ;ջ(f=6fF nS幓/eP?_\H^F4ɩ—$a>}0AYO0SIe9_SGmqV7 #I|ѴUx؁r@~# +A4 +0ȎLfNQKA9ceგh0]P5AzxBqOEsڡ)밯l?a ?@mRDCk r;fBX7 Wk~:>Nr. ( YBs̋58n.$1'gs_V6iIf~]eLԩlFeGM3%b!XKv8]sbҦ[v {뷿[\l-[UۀQLgNjV1 e3 6~8'F):~8H`c_c[j4" G#q&h +SJG~˵Di H=a?F%Lk NikؒA`Ur/~mksc \'ԹmK6G1?4Q=i) i*d#_׏TJ=6{91rYT{N~QOg *^*˂g |hW10 +iZa痼sIXƧs[SŐMX% 27>$D2>cʞۯ(2iqQUU;9=OCh牸֙-9`D/.>L}T| M(dkO.9J a^!X+<}ieRE銴Ƙ屮0UإfYs`,_O&% Ht v 8 7"Nԅn[02e]VHs↸R[789 \O!r̘$񟄐T7)/=kupv›^aˋ Ex"sNĝ"n(15@:फ़1 pO#ܽA "bOm*|^rv8yun!q ^DݳC 0(˿0*Ay@xy1# SWTRR$"RF〦+Ƹ[zac06 R.xbY58,uՊdl1!.v2&gm^$GQ,Xk `z ف #rW-f?2ɟp#?فS~C 2q My3Y[F% (/H፭z` 0OqNu~899[==@XRe +lV53i"H#SBv? +(я#dAQ,8'@6,:>fS͚\5{p[˙J^8+T1\0<Fʈ`6wV1+ۤR+=Y>ӛ$g"(ȟyZ +N٫SQU^1lF0i\51Nhxwl30q&צ#q$$U3:eH +zTXlMA7o[++m?=UCi=/Xe7qމ|C.ZI&0E`ɔ_PI;(O{ɾ%F; j־C'?/~W͏/ûn/?ğ581-&kx8({b2EL k'^q)ӹ 4`|(≏x!߯)=Aє05'ղT*O,:) -(SHTҘŤ~%"U!a^S0yF#8HFDm ݺ-f*qىl%4K+,BU,=wûK@' 4gEݳD펲:fJa͌1 mطϏ4<0Zbtb`p0PF_ +KS , +SV4;g$0ps ᥔi\U3 wk mR./lU) ^e1NbxVǮ!|Sћ}ay͊YF"ԦؼTr1;e`QƸX +r(pF ZF 8&C HUh g?h|IŷWܵ¸]Cwd2 +|BPO{c5݊eqqN0$$wKyU0CK +½qq +퍦YI5F6uÐzxN (azRHA enא5caۣlio|dw 0)u&j~d Q˩)d'4 J ynΰ͉[jWǩ/qBr8%4] Kߙ扆KyTnp\6O|Sc5'b{!uF؜iS+95(kpS'1msȖ7t +=[ +mOxHH%lB8 :FK +)S3Fw]qcOn0 ]ԎP,Hu!uuk:Tv7|#^qPp:.F*ɦU\zH~ i5',dwKYl+cǜL ”,ZH Kف8 +!`&[)@h" 8Yk!aU'|U6bS9 r@0KJ1VcT϶*QS\_ +q7Սk 1ˏlU\U W5'kuiH +hsqQwpcLQ'"渪18*1w2إKsN X(wqT:e2}Vx4•;`"ڳhpnL`(A4*z0qG Kqkp Z ȊXrګ@ĺmF3fǮ!D$*٩-$aVrAdw/1pAQ\m%̩YP' }ٮXK)zZq8J-IޘdH\yG .>Cvś ӑ}Q9GUKNZ*q3a*kH8&=R'?oiy*7(#u|FYX*nͰ2iN#a,IzP?v2de<1˽{мUA!c[xL*h +55{~-db,n*ŧJ|FQyI,eHEZqx=kJF'e_A3 .B]_%FlO9uߛc _vHH7qyԠhj>|ԏ6l&H{6^ZކΚo_IĔV0it *Ԁp` ᯦]G̎c8;/^Kt)ewFSB(GlGi'g T|>BnnFO& wsd;K8-uM&/NBk]BB捐iWu(PFwm+F⺒'ĻU?^NR/u4Aۧ/0)B0M`Uִt{,ꄌ +ُ0Lǻȁ!ok]]GOk=sLks879|5H9"'s FDŽ_zKZܿMDҵCy^yy+n'i2Y)Ϗň <% e17D`6&F VBz1J.߮V+(plUG ta*wT.ez :b?l;lU`tĥ*3<W([+8IsMW3屼A\ #BJ⫋R\z\P-L +0\U*%q[l0#uH]xͼw E0ah ' z0FVv4X2K ' UkȠbx1aɰ2M B{ezg ޘmP +8匃Sm^h"zJ*vW73ГL,ʁD;ĬBܛrpk\]*rFvfJoCC3<5 +RN):%c'?]ˏUQ3e:\`ϵK|jݷXF?i^Ra eڟRHP ɐr'i42˪2Dp ;K=rxeh2-O7WP|Gss+96$!oM򗜛Iܷ3z,EbEHߞRI]z_xeySST9`$A9 HuG my(5V+'Ilʛo;LI=H r,uvVP_E}P=;A>D>MʰΩ_, X9_8}2e ^ǘVon,.RhtC̟O$ԞgsRjjm΃9 +?%#H{f7𻨌W2'#!#b+s 8Riqg }׼j[UΥ $ 'f2*|An~$o0\h"jFPv5,1.cj%ye] |G iN+еlB\[\5P4wQ^#sjyZ0Ng:joLMoFh\-Veᑒ.a a%mq URҫ]T9Q)R80*ihN*G eƓ\UhbЌh׋scfo2Lb"d8^F9v#xMsz$-y3.¾>=3yRUK [~|w gw-9FiğlIy:F3O#P|+N7>>񊭻oe"X}Umr E+a(r N .[Bp@iL푋RaU5{ mZc; T+PL mkE=хTb?Q(MɔUwa\J~b '0Zɏ?MD +@ΡA凰 K ɳC$- >k:(G9é?>@9\&W͖1?#7X;>k \ ǭim.cS.Lz[gzx;gDRxuoe t1hmtz<9Ʃ.X;I?xEC +8m\0|m5ĕS}Etw99GNGX~(XyiJrkqE(,:&|Hϗ2?C% + !i]Ggkkhڌ:dW]OmS#O3>g5rRVZ6U81's[/pG*-)h;Z"5zgM_>67aw`ԡ̽>@A>G\ + r6 a(<< ǁ&禷 >n>%PG|T;Ѵ2i +B1h-V%S!SКQG{B]4_ d`Oָikr͒,.(-L$ɮ_BWd׮l Q6*^1;1"qU=ǧ\N1TR @vSLZ'W' HpT $48zPpTq(0()%5;ՎQq)0P|11 Si8O|v!/9Tc7 θrWMMw֮*!& +?ML!@ahs~_5fu9S:'|}LeTCYf>L 8=)W`6F9wǹ$UhPWvBFXȍOGŸ]Gp:i3O|~\w@${c53N8֛|Y xfPV8oj6"v&SB6=pPfz (@w&وk1r\&ctr+IѬ$֮ӁHn |?8鍩.  ffrtrHr,9>f vRZ\i d|J&211ʹ*lz~-IqUm*c3޻*A}$r uO#m m 6 ԧ`S2fSK D_O]Xib+ +g5'e݅\ĶC~O^%S|b>1˞qh2L Nꬻ j`AHj|*9~l7\N.U '} sYpU*GW!m_Y=?94ZNl~X uGUM@pݳ}SG3eZ> $n+ %>^\saHYt@֞#k6'Y%i!YE j秶x6_1Xu!jvy"2jQ^aR ̳eW_ ч}+o*šY QgGr~WB:УzP-74y6?Ψ W׉??/'y,]Ez?Xs/aه՜>qO(f1 `ᅙT2-NEO7! ~.sf͎\-9>ߓYG׭bVR)6F0#Va}<ӛ ?</9+=?^Zr0sy.\6ǐzdf~;F8W3 9~lU \ No newline at end of file diff --git a/imageio/imageio-jpeg/src/test/resources/jpeg/broken-bogus-segment-length.jpg b/imageio/imageio-jpeg/src/test/resources/jpeg/broken-bogus-segment-length.jpg new file mode 100644 index 00000000..448f364e Binary files /dev/null and b/imageio/imageio-jpeg/src/test/resources/jpeg/broken-bogus-segment-length.jpg differ diff --git a/imageio/imageio-jpeg/src/test/resources/jpeg/broken-invalid-adobe-ycc-gray.jpg b/imageio/imageio-jpeg/src/test/resources/jpeg/broken-invalid-adobe-ycc-gray.jpg new file mode 100644 index 00000000..e14599c1 Binary files /dev/null and b/imageio/imageio-jpeg/src/test/resources/jpeg/broken-invalid-adobe-ycc-gray.jpg differ