From 7370a0b1cf30849ee132926e93b2084970a9033d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 1 Jan 2022 14:54:23 +1100 Subject: [PATCH] Remove consecutive duplicates that only differ by their offset --- Tests/images/timeout-6646305047838720 | Bin 0 -> 69487 bytes Tests/test_file_tiff.py | 10 +++++++++- src/PIL/ImageFile.py | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 Tests/images/timeout-6646305047838720 diff --git a/Tests/images/timeout-6646305047838720 b/Tests/images/timeout-6646305047838720 new file mode 100644 index 0000000000000000000000000000000000000000..eae1f333a031a2dec28b29961e620103daf64452 GIT binary patch literal 69487 zcmeHQ30xD$_n#zys1%~2#S0e=Xb}-mA)c(DAZif-CE9{0px^=i1eK$jSivf2L2U5` zS`R3qpuZMSR8p<}0kzaxYU>5o`l}Tct+f_8_Wx!#3n74s7hb#lVCQ9Kb|;&eH*eni zzW3gLADJVBbnkZHAtZnjuZ^`phsR^e+B_NJbwE%>U%I>weW2WxCKR8iV1g-A6fP4$ z!v7jRr=<1ee<;cq>ezeMe_r3dp)Y=F96=hTC+XLDRhtF{Pehqy$ zTl4tH06yFD4nj6ihLNCEP#&phgTIG^qKt3ss8k-q)1up(!RKS4jGx~H%I->iJ)n#~ zw}sC`KWT%;=^-=<%J>=wf4Ip0Ux=9hzO_JTCH#$nKOGp$SMWD?7(%yaBV@e+_hJ4+ zNN?Q4px_X`5TOOZVT;_I9SF&^=|r3F;cK=;KKnSP-Q-}i9x#LsgX>qvw`BV2B{ z{`r|61UffhoEt$je6CTcgWtkMVK5>$Xg$b3Ak+`a(NLbhG;AUM{4SIYXU)T9K7I{` zi(r6IHp1mOOc}lyO#f!QE~gtlYv|kX zS;&_Ni66kbNoe?N)@FoqV-PaB(D0ck6(NIYgmOxhzE2lCUjoCz77iOYaOu*emO%l2 zmiUF%UuqlFw`^3P=u1D9{!r<8miT$~?~WJ~Fni|W`C$ZpZ+;>3Ll!S0LKn{T3m^ul zPU5HTs5C4XhiNNautw<1!aZPiz@mU)_)1e@HU|aIfoT=&9~2f85=;aIw=|QQ@5a2; zmj4|v#Ln8r%FfQp#@cq!(4j-D2Z@IawHjhOL~LhgH<%df=HWD8kmUgDcBYF0J}{jb z7P4p<;pQ@turjkI#x4vU8|)Y2AJER!)FEUs3^90)LrC~A!V3Pgwt_$CW;!<5A6CVJ zfZ(uDP1_C_9pXO=k6GQ_7qi#%d(4hoRJG2qD!yJ|QqZzBB$oxne{YyYAE%+NF zvBu1%=_PFX(Jc6g+0GiCXN79uWn^V!WQVR$Xup^Nguerc6<7 z&(_Do9h<9HZU4M!_W4;EU((MPQUaNEb|#DlAp+^#l2g5qQG6Q@BE}&t>_SovLq~*? zd0`jQZWY&MKN869mB3q)olQUMS5jwO;9U$~`QDyGvYz?Zv-)<+Hd+Ssg6X@nqimPm z>}>ptjR@$zE{Ul=U;kOsD;?N9BIJlzf4Wa`=w;j9Kngky^)Jpy7*g?n8%G%fz4pP( zKPMbd^*Q`!Nna8XN$@(QCNU0p1hsCcrmXcR`}3RQPd9cwEA3r>xeE*6-Oqq`uQNMq z{|~zU%x_cS6j|+%X5ue&VCX)xeE6|Ljs%u%WoVv_7P3WiI~6!*6YSiDmyCQ-bMx63 zYViC`Q_N46X6CDBi}M*)$d`CNr&9LNUw|?*dMoC)ES{pOtE#FdDAteadU{rx{Z7rV zPj>uS=9;ay`t}*Inyk;v*1ejrANFcsN-_W-k(2oXO{JR~) zZVWLUcI((q=l^6!jaqio5c+G&yz)zrjWIGPg#Hp9S{akH=lT-&E$vR3IJVb?ZH8QW zsWc}t)1a`=I$HAL;L=CIO+H$ z`-Vn{^p zpT2~mCh{Xh+q_C5-9h+0))9%uCq^G7yzjb7Oa{w%$PE!2Ty_@roix~W{n^QI3)3}Q z%1yTQtg|FNx+2LUirQD>U*wQP_{*gok&y=_?T;iKY&I&}2f(HbiHDCvFI61V^6)9hiOja_gcn{oC4Q{}`Mrw+?6fk3as`;;*g@ z#{Ee+Pvd)Ne$Az%@6)TVEK&@E9W%N&5~Yk2m5xN0({9vvWx~Vg>KKv=4}70 z^yZn<({83%c5ZGn)gLqtlmIAr?(Wp-BO;1BD{rPn>}KjlZ>GzSRGkaKYfmn}8bNHG z+LzvZfhJFUHhkTRnJbp2)u_fu@9S$H$Wn_)+&XE)QEu$kifk;~rqN!wwc zj_;?knd1J6&9p0QrnNp|)Wz5-X~O@Om>a}mSzhesCO0%1;5@-dSBIuge|9zC;+@?7 z`dR`^cgr|^uC}szCDJ+;We;bA)W0ZdAiBHt6tEi}nee-unqjYv>L`;ihu!|PFk-(} z0JOEU-)r|X$HGDIt(+-dBZ=k0;WxZtGrznnr;ft%Hry``^Qzp;Yx4s0%lBhm zhh?8b`>s8hk^5n<9iN0dV0MF!T=`#J1vR3aB@MkS0e2LV#QJf&3a>l1aW(j2 zEZovGBB|U2^GbQbyU1-WMI~clVHM#|N2Oq<`#nPni`rc;AzeasJ$ZYKxT(4`5)*0AcH1!x}=zI!jkZxB* zgLJ!G(j%@=A>HE5_?TidCXu}M#E*4S9|5xfn9W$f@n*aaZ^l}O5lEvdoAC#D!uE0M z`@P*q)Ym?e;kRJM68E?6#xpj8o}nb(jp+@RSwZedC>+g4zq=^J+eRC#F>J7#nGKfR zU&)`lp}-}SG^;kOm=rMDa)_diN-22Kw_EK( zihIgI-Aix0B6qKtxZDD_GRiHTLsUVv zgOx5L)RSIIFM9!>n!)guINdMIGl*{6k_Yu}&+w^{TI&S$m1r5L5x>uY0q?Q}p-q1Iug&gZPvQEPWmH-FUCH_R`M zY!o84ee*V*mTi=rO{X=iJ56-BNLuWm$xSv8dH4rRTp+wHCM+`l1wsq1huv6sKGW4EsH%#5W zP$!%rkcHFN+H?KpRO8N=?uHVy7F6dXZWwHZ!5KZ}TJ!Vw zi9q410DFi(TjFu0Yw{;{9ksPiL3{ZX@f~MSn9dO-ITc0L?3E|{cWsCvtw3e;Q40*W zZ{9RK*xtfmEY?Sfds?DzyJVKmB23oV{O4qMIJfEEzL+yvXUNya)13e2k*GX#Y%+aL zw8a1gIEPuBUq?|XHH&ElB|hgJ^7$h){^S^H+R{~Bjqthf$SCLPGO7Jlu+M;g3&|uB zulwgIdweb<5!!YAH%dAj6sDli3?h;5td)tB)Rk68fkGF_?v9>LNhk6^9py~hd-Oks zlO3^noJb4`RG;w)p72N!{K#0L+ml?|36WFj@f^hJC;lMkJ5X<#aZESm%lGfCN}%|% z+gYbfU>K>$^R6W`sVM*C>VQ1QRaOc>#?>LQH6D2;i&;QM+bP)Eixtd@NlI`^O-`xF zDK%Sy)G5h7Z>Li8r6?Zz0i#2l;*nE4Y78T29>Jn2_&q7@3)7HOp0qN6hEtw^L9qGx z%+AN=l_wk^R%Ly+hQ>tc881h9@_Oh_;!iAhOAkA^@f1~)PzDE=x{7Lm9ccL%Zh1g1 zX^(E$QWTNoo)>d5w^n@1X`K)l@0g8+rnJHF!*(+8^wK5PyZB?IkQm`(>d=`2)B&wW zrO*-%X1@Dp5*s~t*B>-Rp4~_8zm|zEY=NSVewvDD`o9tpd(iZsOOK4O95mR5x(MEZZQHih zYp-YY&O1gnCOu4Sn!QTTFjsSx)G^dS7yKms1-#yf-+?FSz@xsyZkqxgcy_|oNyC$l;b0LD*~9YKVH4*lmjrUVgD`Z zxqRU*(&9=BdM&n|128wgy{c>$)_$E2!LP%p%4>GAg*#`348T zp`dm#jkuzr70G1}dST4sig3ok;ZE-rdbZQ!S0gQiAz(_FMZiF!pIFRdoKpeDEZ&>@ zF{s>V3}p$1SOaFU6OCCEW0l}BP@GzU%I(vfIw6L3taHN7#@AgEzpk4GwEPDKvxqT= zDwxGi%9us1$6yw3EHuCDC)hf)In1I00rpWQ=&j+r+eY2|^M%3T^}PoKM2xUvX|RoH zq?}M{AFByMi*3(}o6n3W(^7|-Zmf52P`;Sc-&fQ31MlOBzF(Gx4i4oQ*e;}j?J}<^ zQ@j-_)S<{-7(F^Sw3?wu2U(?o`_ipE#(^O|KgumHx;X7pacx2`foyLbjWFi>%i7%| zBlOU}!zfUByXS>nOauRg$sIbuZ#-`EI5S%ES=bTr5s5_W$ARQiI|>I9Amw_Z&53s( z4g@_vsIWWCTLqF+j63Zg3G_~^f+qYOk~|7ysZsN`vA){)?) z1+}-$G4u&LJRLM%$=94)DIcy%IjV8{k!pcQn!B8*FPR3-PAu> z-FjE8Z#>?H@6XxwUX)!AwvlHA*1in4YXu}INX_;7xQ%gIucy>{agZSuwymU*YK>x( zQ&NM}#(3eY46jN1r-BT<9$K$f)}nB3;F=(2)kzig^_&)kj*?OTJ~TWfsax-_ixy>U ztLu+nJuONj_b^5{Z(eoQFi9AuUr#F*k>Y6c`a$A2blYo#Zo3iBq1#>qm)%#%V^{ah zb_T@pQ(tLsMK-`Ij8cX`o0s{^!?L(h@LC2OdF5Ob#azGYCu@XqP!(*{(X8O3DGGpX z&k9y7%?M5$2v_BOw}uTu=^0JT3rf@H#d$Du<_In-Z401HD}a%Z?KbIRQbsdSSU#K7Oosu}0^}1`{TiOyx}qzkKdA zmrUgaB~y7Tunnr)dJVoIoLp}mVQOq7BS$Akv#jbCK@6ZI{cC8&eGuilG3_sE~ z1QyNsQ!<)k_68tdH1e;k&#|PDW*FI^K`Keh>V5tXHXH5at}XcJve8a%IIR`JxX6wF zM@M20_tleu*Dd(`ju#b%*7^iOoeV*Alg~ZPZeX8VOpo#GGjjj$7V4s#EcxiFz!+_X zIF`v3(5>lJpnpx)^8jQ@rSE##TRG;5Ck}c-XNrJi5Pbebo>Bl5q9Fjv`Fy)Tq}wfe zDg;2WGKi~yFaToG3FRlA*R!A0ZH*2dqc|_t``VT(X#;us(RA`9F?nif=#|RK?m8=0 z;MktwhpR1yL%O6%mF;1WMG)jgPNl>v(k~_X6|Jfk!vv95xy%CxU4&hYAw5$#4`-2> z?YBAUH0^4A6Vo&JkwY>iIJ#xZ8Jw=EAw5$H_6_lc?ldTF0OLWg(Vq2K`LpT7Z9Ho^ z`IJ=7k;2KRuUQ@wfgbNI%wwXNB~o?6QAe}f=XK6^&E;Zv>I|D|b1^jMy~xfP)>_BX z9NMVaHL8RJYKyjyJdy0I)PfXzOjIGN1!=X0YtaP(WD`ItXvBD=shTD ze4y;m?Dr>N(G3oKRacAp)SdUOnQN;0?sk%@%xL~vpmf2drHPZUzp&^=H(~t z-=zIZ(-kzRPG6dWlX#2s!Tx*r56+#k9`V_Dku_N)EiS_5y$k9WDHq-G)rs!-+8Gsr z(`$Zlp`DfR+l^PVFT6$NAXO~Q9a-MkBTJf5JZ}OK20kD~Ni~d&J12z93%#)Wc5z*H zl|Xin3#P#B{@m`baFA)tFV#suxV{JPD0)&Anx-lywazQ;!1hT7w{nU$+B0tD~S{PPMX6vFK%qhxx zqu;@#i+Q!=CLRhjrYNflpMFoJ zRF|LKlv@{t>EG5a`^Vs1xpg=!8M^=Y<9{vw>dIi;pG0V;`)gz=;(XN}7l~7&$g~Y8 zi&iPUG$;q+pd9rn!vB_-8^q$Hq1eq$ZfG>Xd4iFy4o#o_>}tTpJGuS!wdnXY zZ)Ps9=0rN~*Z_NWa7Dq99|7b(r=%~5d@ao?>!jASQX##T4xH5WaBY{MU0pF~o)+sj z-YPvQslA$-|h}*(G{PUj6i_B6wm5H2)`I8;&S#pPE(i>s|g=q*AFYk zH029VxZYcWnZfU;s3Ls2y2eMK>bZ$O#v;B=M=usi*b@OZcmA*fY-iq>lvM3H-qDZi_itxwG=aA1Iq46ij zP}7#K>S_dYiObcYndxrd{qsK##xoCFufyLtS6TGAJjxDK8kn}Zbo6SM0HCEe4b#Cn z8+n~7%^23%0Jj(Gne~hPCr)RMNY90)=ld7^x@kd(y zkl!h&>UdGM8+>2R ze#6;sTttO^Ck@t(SwsM82U&bEekYAH=+qTSf?=W7hG`y!BCc{$RJDf^3hqp|eRO}J zpW@^-%m_L2<4j8=<$!`iOrc6>n42dy(CG-sW$*i>?XXX0g`Kcl$96jZC!4e109Xhgw}WrxOz|2?EEm$p zZRYrnp{W>uhrvdj&o-x$2%!{0-^4@c8(V*amfXaQ z;!AsPgZ|d5gdPf}<7m#4blPSMp>rsK%vzSo0B`wsdFq%>)B4A2^}&OQz(?P4D8;a8 z-^Oyylhkw4JOdcr%Ao1=8>8vof>?O@M~heR^*)TxBy|W9`Q`vzSvrXyDcUP3YZ>*! zj}UG1Dv1Qdq3*GcNHkt?K#`aXmhq4qA~v|}#5=$1`m>YqB3!ej++N;Zr06)i+HW14QxqO-$ICt2E9u23U*cb#1~#Y!#1AG6rrgpk3J9z=>wt6YswUF zEW2?LuW8)SrajkhPBre#oNyAf7F6dXZWwG8WxMQVPr26o{C%Q2$|S}iE$l*4jrg-A z9#^_1e`42BTMK7QlV1_van`G&<_MCUiXv40FXl|v8S=I9H0Qs0Br4Awn@oG~*fIt{(&GF& zPG{e;u%P*7&Pn-ixs?C>T|(>OBdsg4Hta1gMrYr!7sWPf9BygvV$I@ge@1WS$)Woi z8_OGjcdb%tg5pt{K3{5L@}bo_3l(Y|q;*4~_Ti$(MP?dcT|QO=9vDzCv)!z0AK`m9 zdSbO77duu-bZ$KTMOIwIYt5yWR!}*>bZz-+!ad%2%-?q8Ed#xN{$58KTZ9oEkb+q$ z?Xs{T?eed=_JOF~mgpsrcG-rDE!UFKfKwzWalGqL7@;Y3R!dF_cG z>!d!M9`QMcmV17B#3lzhYS?o^1G|WjRbry(*-oynJQ|oo?7q#2T`rKxDtQbl}PJYls$M6rT#@x1JT{Bryxxvk4*SoPR+2_1}`9!Fo)g#biNk* zwF026o&DA%9Vx5?amP{%==T+vG&xmfpo8k9{dqX2VL_1O-mg?aS!DqZ99eAQ*hY8r zt{aE#D<2x@tt4qQ`t-cplfaCP{Z0Y6x>de*@UPwJsCm^k!byR zQDJDU4|e^Oq5U(7&ppjtOzeMav8-2x*%FebkA;l~3npU?Ig31u}GuZr>U zOUpcekfP*KOFp_PFh*Me*PYDZuJ*tU0DlE2EL73#y$bZN$$B2Ro<*bUWtY8`70sSl z(~L~2w6tvypU4Q920wC0rUW0lQqEwm)WC&O z3h@1a3w4SEc(|nMDmrF)eQWb69J>Gd_zij}0^Z!|r1 ri^rlRnPuNuV`N)0eytegCd{pyX1A)VuD9Oisp0*nIwDJyaN_>~%R+u$ literal 0 HcmV?d00001 diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 072f7d401..5801e1766 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -3,7 +3,7 @@ from io import BytesIO import pytest -from PIL import Image, TiffImagePlugin +from PIL import Image, ImageFile, TiffImagePlugin from PIL.TiffImagePlugin import RESOLUTION_UNIT, X_RESOLUTION, Y_RESOLUTION from .helper import ( @@ -726,6 +726,14 @@ class TestFileTiff: with pytest.raises(OSError): im.load() + @pytest.mark.timeout(6) + @pytest.mark.filterwarnings("ignore:Truncated File Read") + def test_timeout(self): + with Image.open("Tests/images/timeout-6646305047838720") as im: + ImageFile.LOAD_TRUNCATED_IMAGES = True + im.load() + ImageFile.LOAD_TRUNCATED_IMAGES = False + @pytest.mark.skipif(not is_win32(), reason="Windows only") class TestFileTiffW32: diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index d43667ca0..3374a5b1d 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -28,6 +28,7 @@ # import io +import itertools import struct import sys @@ -210,6 +211,13 @@ class ImageFile(Image.Image): except AttributeError: prefix = b"" + # Remove consecutive duplicates that only differ by their offset + self.tile = [ + list(tiles)[-1] + for _, tiles in itertools.groupby( + self.tile, lambda tile: (tile[0], tile[1], tile[3]) + ) + ] for decoder_name, extents, offset, args in self.tile: decoder = Image._getdecoder( self.mode, decoder_name, args, self.decoderconfig