From 499f5480f1a9b3063097b53592c37329c1d5f6f8 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Sun, 27 Aug 2017 13:53:39 +0200 Subject: [PATCH] Fixed bug #75124 (gdImageGrayScale() may produce colors) We have to make sure to avoid alpha-blending issues by explicitly switching to `gdEffectReplace` and to restore the old value afterwards. This is a port of . --- NEWS | 3 +++ ext/gd/libgd/gd_filter.c | 7 +++++++ ext/gd/tests/bug75124.phpt | 31 +++++++++++++++++++++++++++++++ ext/gd/tests/bug75124.png | Bin 0 -> 2436 bytes 4 files changed, 41 insertions(+) create mode 100644 ext/gd/tests/bug75124.phpt create mode 100644 ext/gd/tests/bug75124.png diff --git a/NEWS b/NEWS index edd4e29e54..bd93282df5 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,9 @@ PHP NEWS - CURL: . Fixed bug #75093 (OpenSSL support not detected). (Remi) +- GD: + . Fixed bug #75124 (gdImageGrayScale() may produce colors). (cmb) + - Intl: . Fixed bug #75090 (IntlGregorianCalendar doesn't have constants from parent class). (tpunt) diff --git a/ext/gd/libgd/gd_filter.c b/ext/gd/libgd/gd_filter.c index 22a393c126..fc48cd08de 100644 --- a/ext/gd/libgd/gd_filter.c +++ b/ext/gd/libgd/gd_filter.c @@ -53,12 +53,17 @@ int gdImageGrayScale(gdImagePtr src) int new_pxl, pxl; typedef int (*FuncPtr)(gdImagePtr, int, int); FuncPtr f; + int alpha_blending; + f = GET_PIXEL_FUNCTION(src); if (src==NULL) { return 0; } + alpha_blending = src->alphaBlendingFlag; + gdImageAlphaBlending(src, gdEffectReplace); + for (y=0; ysy; ++y) { for (x=0; xsx; ++x) { pxl = f (src, x, y); @@ -75,6 +80,8 @@ int gdImageGrayScale(gdImagePtr src) gdImageSetPixel (src, x, y, new_pxl); } } + gdImageAlphaBlending(src, alpha_blending); + return 1; } diff --git a/ext/gd/tests/bug75124.phpt b/ext/gd/tests/bug75124.phpt new file mode 100644 index 0000000000..b37afc9785 --- /dev/null +++ b/ext/gd/tests/bug75124.phpt @@ -0,0 +1,31 @@ +--TEST-- +Bug #75124 (gdImageGrayScale() may produce colors) +--SKIPIF-- += 2.2.5'); +} +?> +--FILE-- +> 16) & 0xff; + $green = ($color >> 8) & 0xff; + $blue = $color & 0xff; + if ($red != $green || $green != $blue) { + echo "non grayscale pixel detected\n"; + break 2; + } + } +} +?> +===DONE=== +--EXPECT-- +bool(true) +===DONE=== diff --git a/ext/gd/tests/bug75124.png b/ext/gd/tests/bug75124.png new file mode 100644 index 0000000000000000000000000000000000000000..b5d5d1f4b258a45b9c56660c9c5ed1bff5840d2b GIT binary patch literal 2436 zcmV-~348X5P)kUp?O9#1qGH_N8sM(k5z2MJq*A1PO$wK!8AiDu@J9D%5D ze-P6&ZJ(!sTYu)>X*|dpqy^(q4(>VXX-~)+Z~pRE_uS;=pZ%C@vdu0a?KzezKrA1bb z)~odZJYIn31kABdE>3=%=Q%$~62E}|xmH~AFr9qhEL(+)^W5q4M@&LLxb3m+H-)^$ z8;0It!wsy%*WrNY(Z$?i|J0@FZ<0=YGfgl>9LKdsPWv`wh|3d~_tx3k*AKk#L{7@1 zO~P&?tIcuHg;9YAwMaoXsNjJt6ZY_5$m2*)=mE5J}Qryz470&u6;9Y=z-!8LUmCNS)8qNCA z1AF$C4HXe#IbEw&dPPa_R5HAC_cPms(iMSd$W12MAGh5a%k~L!liYWB_w~7S#xr{E z;*rD8KYI6hZk7{(YbOFs~{!o`-C7b8ucb??}_l{0F%X%Mp0 zAN1*0M{o8axIt|{I5h2#d$Zn%+XMl1eI`L|S!eRnR6mrdUF&*NvkI%JCT954w{G-u zB1iB4(&G&{+bC5^0f*C}6y}%FK+APOeqAxmQn6$X>`C&ntPm=1pe7=P z&z!iBA}D-j)7IfnEJE;tTVQ?;@D8}^);+wGva-)ALwCB2&@^>NBpBvQ)ie}Yb>6yp zD>gVhATxwh5joMxHzZV&1$FJlE|wx_O>D}z$cn_syQkOVIA(ghUb`eo8W6B76anmS z)w9)xRS!o1SFIPhZ6O2{*^6Md&PX`Ah~fxx?ef(mNs&lbvYUreL32%x;CNo?S>MId zPTX9YEqn3{MWt4&y1V23H&Ra~8fQb`aO0NnEv5Ue{c?}KG$-K(YjeW z0E+e9Di-`NA(zvcAaD}RE#`a_MH3#UN5XK-XtFF_C>4lcFmMHhRH{~LDU?8|LZ(2# zXO%!10YfN3))a7KjH;IE-+J%w?|&^2_MhDO*p9bVRm0DmI`fT6xw6&aaLnv{eCO}L zI+=D?+}mkyLb@6@Xo((5N^t^5L7}a>+^(XVcH_`}bX0_5 zjLTiH_|r@W3n^>uqYyd_9!)#0$Cc86WJyBLk22pdkL2;-!5j6qCVrv~4;cwzidWzxgfS)+bwVnr7-SG$DOKDc0r3W8p(uzwAhHS5 zW+pKLP1Kg_wqPhY4p~Tdc6EZPEJoM{Tm9nm&;A?;aSz)l{%5>)>`k+!AI4q9vDVU- zi>;29g3jJqYt%MoX0q{OacRBK6qu`*uXZB{B1hxV(=Cy-JrbeSMyr!hTd*3$Dj@Uf zpN