Skip to content

Commit

Permalink
Merge branch 'PHP-5.6'
Browse files Browse the repository at this point in the history
* PHP-5.6:
  #72337 invalid dimensions can lead to segv
  • Loading branch information
pierrejoye committed Jun 7, 2016
2 parents 214d461 + f801259 commit 4f8a451
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 1 deletion.
4 changes: 4 additions & 0 deletions ext/gd/gd.c
Original file line number Diff line number Diff line change
Expand Up @@ -4667,6 +4667,10 @@ PHP_FUNCTION(imagescale)
}
}

if (tmp_h <= 0 || tmp_w <= 0) {
RETURN_FALSE;
}

new_width = tmp_w;
new_height = tmp_h;

Expand Down
34 changes: 33 additions & 1 deletion ext/gd/libgd/gd_interpolation.c
Original file line number Diff line number Diff line change
Expand Up @@ -1059,6 +1059,10 @@ gdImagePtr gdImageScaleTwoPass(const gdImagePtr src, const unsigned int src_widt
gdImagePtr tmp_im;
gdImagePtr dst;

if (new_width == 0 || new_height == 0) {
return NULL;
}

/* Convert to truecolor if it isn't; this code requires it. */
if (!src->trueColor) {
gdImagePaletteToTrueColor(src);
Expand Down Expand Up @@ -1087,6 +1091,10 @@ gdImagePtr Scale(const gdImagePtr src, const unsigned int src_width, const unsig
{
gdImagePtr tmp_im;

if (new_width == 0 || new_height == 0) {
return NULL;
}

tmp_im = gdImageCreateTrueColor(new_width, src_height);
if (tmp_im == NULL) {
return NULL;
Expand Down Expand Up @@ -1120,6 +1128,10 @@ gdImagePtr gdImageScaleNearestNeighbour(gdImagePtr im, const unsigned int width,
unsigned long dst_offset_y = 0;
unsigned int i;

if (new_width == 0 || new_height == 0) {
return NULL;
}

dst_img = gdImageCreateTrueColor(new_width, new_height);

if (dst_img == NULL) {
Expand Down Expand Up @@ -1221,6 +1233,10 @@ static gdImagePtr gdImageScaleBilinearPalette(gdImagePtr im, const unsigned int
gdImagePtr new_img;
const int transparent = im->transparent;

if (new_width == 0 || new_height == 0) {
return NULL;
}

new_img = gdImageCreateTrueColor(new_width, new_height);
if (new_img == NULL) {
return NULL;
Expand Down Expand Up @@ -1313,6 +1329,10 @@ static gdImagePtr gdImageScaleBilinearTC(gdImagePtr im, const unsigned int new_w
long i;
gdImagePtr new_img;

if (new_width == 0 || new_height == 0) {
return NULL;
}

new_img = gdImageCreateTrueColor(new_width, new_height);
if (!new_img){
return NULL;
Expand Down Expand Up @@ -1412,6 +1432,10 @@ gdImagePtr gdImageScaleBicubicFixed(gdImagePtr src, const unsigned int width, co
unsigned int dst_offset_y = 0;
long i;

if (new_width == 0 || new_height == 0) {
return NULL;
}

/* impact perf a bit, but not that much. Implementation for palette
images can be done at a later point.
*/
Expand Down Expand Up @@ -1634,7 +1658,11 @@ gdImagePtr gdImageScale(const gdImagePtr src, const unsigned int new_width, cons
gdImagePtr im_scaled = NULL;

if (src == NULL || src->interpolation_id < 0 || src->interpolation_id > GD_METHOD_COUNT) {
return 0;
return NULL;
}

if (new_width == 0 || new_height == 0) {
return NULL;
}

switch (src->interpolation_id) {
Expand Down Expand Up @@ -1680,6 +1708,10 @@ gdImagePtr gdImageRotateNearestNeighbour(gdImagePtr src, const float degrees, co
unsigned int i;
gdImagePtr dst;

if (new_width == 0 || new_height == 0) {
return NULL;
}

dst = gdImageCreateTrueColor(new_width, new_height);
if (!dst) {
return NULL;
Expand Down
14 changes: 14 additions & 0 deletions ext/gd/tests/bug72337.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
--TEST--
#72337 segfault in imagescale with new dimensions being <=0)
--SKIPIF--
<?php
if (!function_exists('imagescale')) die("skip gd extension not available\n");
?>
--FILE--
<?php
$im = imagecreatetruecolor(1, 1);
imagescale($im, 0, 0, IMG_BICUBIC_FIXED);
echo "OK";
?>
--EXPECT--
OK

0 comments on commit 4f8a451

Please sign in to comment.