Skip to content

Commit f6da708

Browse files
committed
Merge branch 'PHP-7.0' into PHP-7.1
2 parents 02ba9d7 + 12967bc commit f6da708

File tree

4 files changed

+52
-17
lines changed

4 files changed

+52
-17
lines changed

NEWS

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ PHP NEWS
2626
. Fixed bug #73159 (imagegd2(): unrecognized formats may result in corrupted
2727
files). (cmb)
2828
. Fixed bug #73161 (imagecreatefromgd2() may leak memory). (cmb)
29+
. Fixed bug #73213 (Integer overflow in imageline() with antialiasing). (cmb)
2930

3031
- JSON:
3132
. Fixed bug #73113 (Segfault with throwing JsonSerializable). (julien)

ext/gd/libgd/gd.c

+29-17
Original file line numberDiff line numberDiff line change
@@ -1296,7 +1296,7 @@ inline static void gdImageSetAAPixelColor(gdImagePtr im, int x, int y, int color
12961296
void gdImageAALine (gdImagePtr im, int x1, int y1, int x2, int y2, int col)
12971297
{
12981298
/* keep them as 32bits */
1299-
long x, y, inc;
1299+
long x, y, inc, frac;
13001300
long dx, dy,tmp;
13011301

13021302
if (y1 < 0 && y2 < 0) {
@@ -1366,16 +1366,22 @@ void gdImageAALine (gdImagePtr im, int x1, int y1, int x2, int y2, int col)
13661366
dx = x2 - x1;
13671367
dy = y2 - y1;
13681368
}
1369-
x = x1 << 16;
1370-
y = y1 << 16;
1369+
y = y1;
13711370
inc = (dy * 65536) / dx;
1372-
while ((x >> 16) <= x2) {
1373-
gdImageSetAAPixelColor(im, x >> 16, y >> 16, col, (y >> 8) & 0xFF);
1374-
if ((y >> 16) + 1 < im->sy) {
1375-
gdImageSetAAPixelColor(im, x >> 16, (y >> 16) + 1,col, (~y >> 8) & 0xFF);
1371+
frac = 0;
1372+
for (x = x1; x <= x2; x++) {
1373+
gdImageSetAAPixelColor(im, x, y, col, (frac >> 8) & 0xFF);
1374+
if (y + 1 < im->sy) {
1375+
gdImageSetAAPixelColor(im, x, y + 1, col, (~frac >> 8) & 0xFF);
1376+
}
1377+
frac += inc;
1378+
if (frac >= 65536) {
1379+
frac -= 65536;
1380+
y++;
1381+
} else if (frac < 0) {
1382+
frac += 65536;
1383+
y--;
13761384
}
1377-
x += (1 << 16);
1378-
y += inc;
13791385
}
13801386
} else {
13811387
if (dy < 0) {
@@ -1388,16 +1394,22 @@ void gdImageAALine (gdImagePtr im, int x1, int y1, int x2, int y2, int col)
13881394
dx = x2 - x1;
13891395
dy = y2 - y1;
13901396
}
1391-
x = x1 << 16;
1392-
y = y1 << 16;
1397+
x = x1;
13931398
inc = (dx * 65536) / dy;
1394-
while ((y>>16) <= y2) {
1395-
gdImageSetAAPixelColor(im, x >> 16, y >> 16, col, (x >> 8) & 0xFF);
1396-
if ((x >> 16) + 1 < im->sx) {
1397-
gdImageSetAAPixelColor(im, (x >> 16) + 1, (y >> 16),col, (~x >> 8) & 0xFF);
1399+
frac = 0;
1400+
for (y = y1; y <= y2; y++) {
1401+
gdImageSetAAPixelColor(im, x, y, col, (frac >> 8) & 0xFF);
1402+
if (x + 1 < im->sx) {
1403+
gdImageSetAAPixelColor(im, x + 1, y, col, (~frac >> 8) & 0xFF);
1404+
}
1405+
frac += inc;
1406+
if (frac >= 65536) {
1407+
frac -= 65536;
1408+
x++;
1409+
} else if (frac < 0) {
1410+
frac += 65536;
1411+
x--;
13981412
}
1399-
x += inc;
1400-
y += (1<<16);
14011413
}
14021414
}
14031415
}

ext/gd/tests/bug73213.phpt

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Bug #73213 (Integer overflow in imageline() with antialiasing)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('gd')) die('skip gd extension not available');
6+
?>
7+
--FILE--
8+
<?php
9+
require_once __DIR__ . DIRECTORY_SEPARATOR . 'func.inc';
10+
11+
$im = imagecreatetruecolor(32768, 1);
12+
$black = imagecolorallocate($im, 0, 0, 0);
13+
imageantialias($im, true);
14+
15+
imageline($im, 0,0, 32767,0, $black);
16+
17+
test_image_equals_file(__DIR__ . DIRECTORY_SEPARATOR . 'bug73213.png', $im);
18+
?>
19+
===DONE===
20+
--EXPECT--
21+
The images are equal.
22+
===DONE===

ext/gd/tests/bug73213.png

195 Bytes
Loading

0 commit comments

Comments
 (0)