Extend color component range checks

We also check for alpha components to be within range, and we add yet
missing range checks for other functions as well.
This commit is contained in:
Christoph M. Becker 2019-08-11 15:00:23 +02:00
parent 4ebf527136
commit 092571c1cb

View file

@ -1836,8 +1836,8 @@ PHP_FUNCTION(imagelayereffect)
} }
/* }}} */ /* }}} */
#define CHECK_RGB_RANGE(component, name) \ #define CHECK_RGBA_RANGE(component, name) \
if (component < 0 || component > 255) { \ if (component < 0 || component > gd##name##Max) { \
php_error_docref(NULL, E_WARNING, #name " component is out of range"); \ php_error_docref(NULL, E_WARNING, #name " component is out of range"); \
RETURN_FALSE; \ RETURN_FALSE; \
} }
@ -1859,9 +1859,10 @@ PHP_FUNCTION(imagecolorallocatealpha)
RETURN_FALSE; RETURN_FALSE;
} }
CHECK_RGB_RANGE(red, Red); CHECK_RGBA_RANGE(red, Red);
CHECK_RGB_RANGE(green, Green); CHECK_RGBA_RANGE(green, Green);
CHECK_RGB_RANGE(blue, Blue); CHECK_RGBA_RANGE(blue, Blue);
CHECK_RGBA_RANGE(alpha, Alpha);
ct = gdImageColorAllocateAlpha(im, red, green, blue, alpha); ct = gdImageColorAllocateAlpha(im, red, green, blue, alpha);
if (ct < 0) { if (ct < 0) {
@ -1887,6 +1888,11 @@ PHP_FUNCTION(imagecolorresolvealpha)
RETURN_FALSE; RETURN_FALSE;
} }
CHECK_RGBA_RANGE(red, Red);
CHECK_RGBA_RANGE(green, Green);
CHECK_RGBA_RANGE(blue, Blue);
CHECK_RGBA_RANGE(alpha, Alpha);
RETURN_LONG(gdImageColorResolveAlpha(im, red, green, blue, alpha)); RETURN_LONG(gdImageColorResolveAlpha(im, red, green, blue, alpha));
} }
/* }}} */ /* }}} */
@ -1907,6 +1913,11 @@ PHP_FUNCTION(imagecolorclosestalpha)
RETURN_FALSE; RETURN_FALSE;
} }
CHECK_RGBA_RANGE(red, Red);
CHECK_RGBA_RANGE(green, Green);
CHECK_RGBA_RANGE(blue, Blue);
CHECK_RGBA_RANGE(alpha, Alpha);
RETURN_LONG(gdImageColorClosestAlpha(im, red, green, blue, alpha)); RETURN_LONG(gdImageColorClosestAlpha(im, red, green, blue, alpha));
} }
/* }}} */ /* }}} */
@ -1927,6 +1938,11 @@ PHP_FUNCTION(imagecolorexactalpha)
RETURN_FALSE; RETURN_FALSE;
} }
CHECK_RGBA_RANGE(red, Red);
CHECK_RGBA_RANGE(green, Green);
CHECK_RGBA_RANGE(blue, Blue);
CHECK_RGBA_RANGE(alpha, Alpha);
RETURN_LONG(gdImageColorExactAlpha(im, red, green, blue, alpha)); RETURN_LONG(gdImageColorExactAlpha(im, red, green, blue, alpha));
} }
/* }}} */ /* }}} */
@ -2868,9 +2884,9 @@ PHP_FUNCTION(imagecolorallocate)
RETURN_FALSE; RETURN_FALSE;
} }
CHECK_RGB_RANGE(red, Red); CHECK_RGBA_RANGE(red, Red);
CHECK_RGB_RANGE(green, Green); CHECK_RGBA_RANGE(green, Green);
CHECK_RGB_RANGE(blue, Blue); CHECK_RGBA_RANGE(blue, Blue);
ct = gdImageColorAllocate(im, red, green, blue); ct = gdImageColorAllocate(im, red, green, blue);
if (ct < 0) { if (ct < 0) {
@ -2955,6 +2971,10 @@ PHP_FUNCTION(imagecolorclosest)
RETURN_FALSE; RETURN_FALSE;
} }
CHECK_RGBA_RANGE(red, Red);
CHECK_RGBA_RANGE(green, Green);
CHECK_RGBA_RANGE(blue, Blue);
RETURN_LONG(gdImageColorClosest(im, red, green, blue)); RETURN_LONG(gdImageColorClosest(im, red, green, blue));
} }
/* }}} */ /* }}} */
@ -2975,6 +2995,10 @@ PHP_FUNCTION(imagecolorclosesthwb)
RETURN_FALSE; RETURN_FALSE;
} }
CHECK_RGBA_RANGE(red, Red);
CHECK_RGBA_RANGE(green, Green);
CHECK_RGBA_RANGE(blue, Blue);
RETURN_LONG(gdImageColorClosestHWB(im, red, green, blue)); RETURN_LONG(gdImageColorClosestHWB(im, red, green, blue));
} }
/* }}} */ /* }}} */
@ -3029,6 +3053,10 @@ PHP_FUNCTION(imagecolorresolve)
RETURN_FALSE; RETURN_FALSE;
} }
CHECK_RGBA_RANGE(red, Red);
CHECK_RGBA_RANGE(green, Green);
CHECK_RGBA_RANGE(blue, Blue);
RETURN_LONG(gdImageColorResolve(im, red, green, blue)); RETURN_LONG(gdImageColorResolve(im, red, green, blue));
} }
/* }}} */ /* }}} */
@ -3049,6 +3077,10 @@ PHP_FUNCTION(imagecolorexact)
RETURN_FALSE; RETURN_FALSE;
} }
CHECK_RGBA_RANGE(red, Red);
CHECK_RGBA_RANGE(green, Green);
CHECK_RGBA_RANGE(blue, Blue);
RETURN_LONG(gdImageColorExact(im, red, green, blue)); RETURN_LONG(gdImageColorExact(im, red, green, blue));
} }
/* }}} */ /* }}} */
@ -3070,6 +3102,11 @@ PHP_FUNCTION(imagecolorset)
RETURN_FALSE; RETURN_FALSE;
} }
CHECK_RGBA_RANGE(red, Red);
CHECK_RGBA_RANGE(green, Green);
CHECK_RGBA_RANGE(blue, Blue);
CHECK_RGBA_RANGE(alpha, Alpha);
col = color; col = color;
if (col >= 0 && col < gdImageColorsTotal(im)) { if (col >= 0 && col < gdImageColorsTotal(im)) {