Skip to content

Commit 0e38932

Browse files
committed
Merge branch 'PHP-7.1'
2 parents 9f92bb8 + f6da708 commit 0e38932

File tree

3 files changed

+51
-17
lines changed

3 files changed

+51
-17
lines changed

ext/gd/libgd/gd.c

+29-17
Original file line numberDiff line numberDiff line change
@@ -1184,7 +1184,7 @@ inline static void gdImageSetAAPixelColor(gdImagePtr im, int x, int y, int color
11841184
void gdImageAALine (gdImagePtr im, int x1, int y1, int x2, int y2, int col)
11851185
{
11861186
/* keep them as 32bits */
1187-
long x, y, inc;
1187+
long x, y, inc, frac;
11881188
long dx, dy,tmp;
11891189

11901190
if (y1 < 0 && y2 < 0) {
@@ -1254,16 +1254,22 @@ void gdImageAALine (gdImagePtr im, int x1, int y1, int x2, int y2, int col)
12541254
dx = x2 - x1;
12551255
dy = y2 - y1;
12561256
}
1257-
x = x1 << 16;
1258-
y = y1 << 16;
1257+
y = y1;
12591258
inc = (dy * 65536) / dx;
1260-
while ((x >> 16) <= x2) {
1261-
gdImageSetAAPixelColor(im, x >> 16, y >> 16, col, (y >> 8) & 0xFF);
1262-
if ((y >> 16) + 1 < im->sy) {
1263-
gdImageSetAAPixelColor(im, x >> 16, (y >> 16) + 1,col, (~y >> 8) & 0xFF);
1259+
frac = 0;
1260+
for (x = x1; x <= x2; x++) {
1261+
gdImageSetAAPixelColor(im, x, y, col, (frac >> 8) & 0xFF);
1262+
if (y + 1 < im->sy) {
1263+
gdImageSetAAPixelColor(im, x, y + 1, col, (~frac >> 8) & 0xFF);
1264+
}
1265+
frac += inc;
1266+
if (frac >= 65536) {
1267+
frac -= 65536;
1268+
y++;
1269+
} else if (frac < 0) {
1270+
frac += 65536;
1271+
y--;
12641272
}
1265-
x += (1 << 16);
1266-
y += inc;
12671273
}
12681274
} else {
12691275
if (dy < 0) {
@@ -1276,16 +1282,22 @@ void gdImageAALine (gdImagePtr im, int x1, int y1, int x2, int y2, int col)
12761282
dx = x2 - x1;
12771283
dy = y2 - y1;
12781284
}
1279-
x = x1 << 16;
1280-
y = y1 << 16;
1285+
x = x1;
12811286
inc = (dx * 65536) / dy;
1282-
while ((y>>16) <= y2) {
1283-
gdImageSetAAPixelColor(im, x >> 16, y >> 16, col, (x >> 8) & 0xFF);
1284-
if ((x >> 16) + 1 < im->sx) {
1285-
gdImageSetAAPixelColor(im, (x >> 16) + 1, (y >> 16),col, (~x >> 8) & 0xFF);
1287+
frac = 0;
1288+
for (y = y1; y <= y2; y++) {
1289+
gdImageSetAAPixelColor(im, x, y, col, (frac >> 8) & 0xFF);
1290+
if (x + 1 < im->sx) {
1291+
gdImageSetAAPixelColor(im, x + 1, y, col, (~frac >> 8) & 0xFF);
1292+
}
1293+
frac += inc;
1294+
if (frac >= 65536) {
1295+
frac -= 65536;
1296+
x++;
1297+
} else if (frac < 0) {
1298+
frac += 65536;
1299+
x--;
12861300
}
1287-
x += inc;
1288-
y += (1<<16);
12891301
}
12901302
}
12911303
}

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)