From 2ea11e22358edda8d3f846f183b97f8395593410 Mon Sep 17 00:00:00 2001 From: John Bowler Date: Tue, 16 Jan 2024 14:59:02 -0800 Subject: [PATCH] Palette index checking fixes The palette index checking function is called by default but only if some *other* transformation is happening. This makes the 'get palette max' public API disfunctional (sometimes it works, sometimes it returns 0) and causes the supposed default behaviour of checking the palette index only to work sometimes. It works in pngtest, it doesn't work in pngcp. The check in pngread also has an off-by-one error; the number recorded is the highest index found so it should be checked to ensure that it is less than the palette length but it was checked for being greater. The pull request includes a set of 8 files which all have the full range of possible indices including one (the highest) which is invalid because the PLTE chunk is one short of the maximum for each bit depth. Signed-off-by: John Bowler --- contrib/testpngs/badpal/small-palette-1.png | Bin 0 -> 271 bytes contrib/testpngs/badpal/small-palette-2.png | Bin 0 -> 277 bytes contrib/testpngs/badpal/small-palette-4.png | Bin 0 -> 315 bytes contrib/testpngs/badpal/small-palette-8.png | Bin 0 -> 1035 bytes contrib/testpngs/badpal/test-palette-1.png | Bin 0 -> 432 bytes contrib/testpngs/badpal/test-palette-2.png | Bin 0 -> 499 bytes contrib/testpngs/badpal/test-palette-4.png | Bin 0 -> 591 bytes contrib/testpngs/badpal/test-palette-8.png | Bin 0 -> 2731 bytes pngread.c | 4 ++-- 9 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 contrib/testpngs/badpal/small-palette-1.png create mode 100644 contrib/testpngs/badpal/small-palette-2.png create mode 100644 contrib/testpngs/badpal/small-palette-4.png create mode 100644 contrib/testpngs/badpal/small-palette-8.png create mode 100644 contrib/testpngs/badpal/test-palette-1.png create mode 100644 contrib/testpngs/badpal/test-palette-2.png create mode 100644 contrib/testpngs/badpal/test-palette-4.png create mode 100644 contrib/testpngs/badpal/test-palette-8.png diff --git a/contrib/testpngs/badpal/small-palette-1.png b/contrib/testpngs/badpal/small-palette-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9dbfd095b3b7be8eca6022373724914d7f9005 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-Y$P6UUy?J{QNHGWagt-1^V32&oX%6HXmbgZg zIOi8s7G z`?iJWZtXMbOV$vded_WFUSlJzrW-TXssZii@^oh6r4-*@-p+%GZJ$ZobtN<57l zx&7C3#@5?wCv)ACNaVWRS(WF`)iJA9Yeh~$@4ZX?1+z9!>ucX!l2nv;FgtD;f7#|+ z_mv*LZ(Dfo);^=YWDW7zr!Jr1H8#>}x-ny|8qj_&PZ!4!j_b)2*ccdO8Dvzd-X;S@ O89ZJ6T-G@yGywn%Bw&dE literal 0 HcmV?d00001 diff --git a/contrib/testpngs/badpal/small-palette-4.png b/contrib/testpngs/badpal/small-palette-4.png new file mode 100644 index 0000000000000000000000000000000000000000..7401dc70b1f56da59b1d07031617557084b82e5f GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~j!VDx;!;N!*lx~1ei0l9V|M&0z-_Y>i!2!hD zKYxEi!+wVZkPwgs1P)-i{Ru$Y!SiHKEKs9iiEBiObACZ(QD%BZ3ByVSBLhQY9Ux%} zB#cZHyz(>h6r4-*@-p+%GZJ$ZobtN<57lx&7C3#@5?wCv)ACNaVWRS(WF`)iJA9 zYeh~$@4ZX?1+z9!>ucX!l2nv;FgtD;f7#|+_mv*LZ(Dfo);^=YWDW7zr!Jr1H8#>} sx-ny|8qj_oPZ!4!j_b)OAx#Vn%$FEGp3Lbu4-{wcboFyt=akR{03LI9OaK4? literal 0 HcmV?d00001 diff --git a/contrib/testpngs/badpal/small-palette-8.png b/contrib/testpngs/badpal/small-palette-8.png new file mode 100644 index 0000000000000000000000000000000000000000..a45338713146ab5b5a5a18cd5fdd3e7165e13531 GIT binary patch literal 1035 zcmW+#!E0Pa7=NiCb!~J!S)`Pq2a&kKBvmN6IJO(QDK!ofmOVt7ZZ`A8E^ry2}@W;M70l`tm}Wrp~3-rpBaNr%I(#rb48g zr;MePri7#zrwFAGrT}Ew?!?)NGsjLJIW=-}=)}Nr?pWQ?sv{+biw?~@n0MfO2JI%+ zKD1_RwX$l@%EXGk<=nE^($JC>i-|=A3olua&v>|FW5>oE7`<=Qu8})N^bF^QH4Lp8 zQZcw}(2{`#1LiZ*?nqmu&A!%Bt3*qoMOSmKSyNM{NvJW^sH`E;pqN$YM#}Cfv#WHX z)IBBpN^}(GinSDt6^RrM6{;w>qChE=!wscPq}h>LNY$6JD@9v!F4?A}O-W*jnM5@S zLkX&xc5WbSUzncIU7hc|qfdmUce2qSpqqbORBZiY8*!OI&T*VgJYrQW~(alF1adQ4pN|{k1ROey$BcNB#BZ)VcAkr1`>U$+Zh-who?sM?Lf2r*FQxntO8gM(&SZ zE4rHd;=%2iZ)cap4 literal 0 HcmV?d00001 diff --git a/contrib/testpngs/badpal/test-palette-1.png b/contrib/testpngs/badpal/test-palette-1.png new file mode 100644 index 0000000000000000000000000000000000000000..614fd97bba7a550cdbec9847ddb01c556afd54f4 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRF$egBxc+BgkbJ~x4&)k^xJHyX z=ND8KWu|A8FsxKCGB7mO0TQM_!pKCyD?cMo!MQXqFEcMaBQaOODZe}?wMZ+h^B+)i zNoGhyiBD#7YF;r=nt_oaHIIRTY?hcL*VEaloG0}I@LEgg(0xZ3M9=sINIJ(p^ zQ?pg*(--BW#i!@BeULg?VNqt;w?EYF&`+-w#t*C1x2Qk-r}Aa0!cwZWd36-c+QvZPzYCJNxJDMD4Qsx-x$oeG~lvcpO)tIU9Wu}cz*Dxd(FM- X^mopLawjjKvl%>H{an^LB{Ts5Eh(oV literal 0 HcmV?d00001 diff --git a/contrib/testpngs/badpal/test-palette-2.png b/contrib/testpngs/badpal/test-palette-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e996464bf4e47c5870b64c1a1f5cbeff2198fd GIT binary patch literal 499 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSoB=)|uK)l4Z)gDF^o1%3KtaP2 z*N775{DR7&%=C;BhLs9N28PBuK*AJA7?~(|*GWt+&@s=DH`5$aTB3D$kv(V^*!!ikyPpdzbnPW^JC<*S@(VsVMJYcHA=lvdy>d zD?NPQw(#7oeMWuB8sf80T|U8UY^2q6W5!xFp#3jAT^vI!dQ-1#6g*_W!+OF0Ajg}- z93l=7s-sEpM!TSfK>AB>zjwO}Wa2+1MF%nD_}%>`k!#)d{Pqie!;R91PuG4qKBJ?3 zegBT0-zsOMJP)mz2%#n@Nog*c2qx4z7H}$MG;z#QX!2A+AXY&RF&71ekADOhJFidY z@YqxD;&5m#hsO?KM$U32g@=ADt|CoJT#kaRFIx5}t*8kTSM#2J_T;y(4No|pPEh5M z(%@Xm5`D>0*e%FwlHaAGsXHd!n)D|~F32G&DX1lAS QKtD5hy85}Sb4q9e0P*9)G5`Po literal 0 HcmV?d00001 diff --git a/contrib/testpngs/badpal/test-palette-4.png b/contrib/testpngs/badpal/test-palette-4.png new file mode 100644 index 0000000000000000000000000000000000000000..39853bfce9a6d4095b7e26e66f216e54769cb890 GIT binary patch literal 591 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e-2k5u*Z=?j@8AEwq2a%S1BkVM z{{DuB{SFBrAs`C~9Kdq>6M(dX=gFQ}phm+I*N775{DR7&%=C;BhLs9N28PBuK*AJA z7?~(|*GWt+&@s=DH`5$aTB3D$kv(V^*!! zikyPpdzbnPW^JC<*S@(VsVMJYcHA=lvdy>dD?NPQw(#7oeMWuB8sf80T|U8UY^2q6 zW5!xF1_nk2PZ!4!kIvR>7b6cDNVGnD%+|)sAuV8Lke6`dzz)V#=GSc3c-Kfrm@UY2 zxZALc@xj;f;;OsPb7%jtTz)Aw;z;PNC&z=ba{sN5@~%9^pD8>2VO$W0;j$^knzw&l zdJ{i8wpLH|`IICcN0wXDSQ@seIySU0?AhBa(6EkKks+4diN%BCz;SgB#uwEBOc%Z@ zxHPnIOb}>TpD(~7AJ;foGlDK!W@DM ziVXYHfvV2~RnKz-ss6FML7?HaXv_YCc8B&a`R%hipls#ew4HCaF(pyVt9SFuEp0}fomx&k7wL4*|- zOewbOi8NAWBW5$cutSB9SQKl!!&bgi5m@HwaR_AX)^WM&Qi?S1z!uz!VC!L7;R3nIRA<0-hvb z@vt3A9WPsWsg@TxUNG~#iRa3AmgSiuo-W`i15YwMk_Z2U#H8| zrDyEki@%?fpPi;(5nt&<*pL~QXo$&7P1Ef|x6w~5O{dYg_pPkjI-?B7%7vFdxGe10 zYbls{*s^8G^wNu-vBI=nMy-FU$K$!XJq9ZabrBv%P8P2?m(5f^{+44-wtaTY)MiN0 z>pHVOYV^))8<3YgQ7TT~8~A4RvDCNc)Y*G`yw!13^wZ>iD^5`#*vL3eX=-4(~_@4zq z*$=No_5S(p&abl{UE4aC_sd4Zi-%XE`*gzx|NY`oN32{j@n-D#U{k*EdC0Z==L2W= zH62?t(4IBexWDDIl_!I<2F~O*RCxW|*Rr!I@BGPkzf5TP@T~sq(OGtj|IS83^C!!W z&hh{740HO>yq_|g-?<&-_R??pt!}F=?3wv!mAkj6*X=sLe1@XGVoy0szIpHQN1rcV zKQx@wmcB1H&;Ij|bWVDm)iz*X-4?$5!NjB~_gxwFM(G9id*|jd+NE=%Y-*S5p*N=K zrEZhQyccYEh6~Ld`0JNn8cy*n#Tx;1&j4_*9>A^+03G=N#$EtWhM|Jo z4l{^GEduHd7XY1Q076XwOx^&vg#dg*pn^6JW-vP79MoIW0Nkzx@Ie!RrdR;dDFA#3 zRM6(b3`QrMgL=~qfYl5j+5*552tY^zkbE5~h^URUt z>UpaE;dtMO&G%!%d8BI8bf!wXJl(N5YJ{`THzp2@kG!-cpCFv}s!>a0mAE$DVT~FQ z?#(wI7#M&4o6VadN)A_yhQ?L-Hl#Z6Wg`)p^RzK{$8!s9-f=-CXBtOCcU1efWI5=x zk%+7X+N9y}(cf)>iA0IDVl+CwD!DDy@x`){guU~`?7QRp5848gf=Zq?jz%X`CwF8y zen=Zh$XOs3g-n{wzFBj8hUblmpSF~_eeVo9d()LMez~1?xuOlfeL*wCw=PZ8{2II6 z1;xO>IbbEZ65_eZuug3X(2RBa&p>HLd^}N_i$_aQnz`X!D9zU|J5hWu9OCgMyHU#R zGZFPY%^>QXFc(qNJ3fep&T>WcEjuJQ@aa^v^4r_N=!ER?r5dV#~s}*wY#Bs z)klM(i+vi3>z{g~=zNK~FVVh6-HSpI>Ryg`j7ljh15v55PyA4tgLW7;-{6SxV*3;Lc?#0?mur2ZHA$`L_NWb|NN}m(B5v6ah zU5U~UuJA-Ly~Yc!d*-9`=hL9q_)CXTn&>o?%z5V$i>^J>4x#IqFWi1~s+!!|srn;r Tm*dg@O-)qzwy>|>rw{!X#lb%; literal 0 HcmV?d00001 diff --git a/pngread.c b/pngread.c index 96996ced5..dc62df098 100644 --- a/pngread.c +++ b/pngread.c @@ -568,7 +568,7 @@ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row) #endif #ifdef PNG_READ_TRANSFORMS_SUPPORTED - if (png_ptr->transformations) + if (png_ptr->transformations || png_ptr->num_palette_max >= 0) png_do_read_transformations(png_ptr, &row_info); #endif @@ -785,7 +785,7 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr) #ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED /* Report invalid palette index; added at libng-1.5.10 */ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - png_ptr->num_palette_max > png_ptr->num_palette) + png_ptr->num_palette_max >= png_ptr->num_palette) png_benign_error(png_ptr, "Read palette index exceeding num_palette"); #endif