Skip to content

Commit 8dc4f4d

Browse files
cmb69smalyshev
authored andcommitted
Fix #74435: Buffer over-read into uninitialized memory
The stack allocated color map buffers were not zeroed before usage, and so undefined palette indexes could cause information leakage.
1 parent 5f8380d commit 8dc4f4d

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

ext/gd/libgd/gd_gif_in.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ gdImagePtr gdImageCreateFromGifCtx(gdIOCtxPtr fd) /* {{{ */
147147
int haveGlobalColormap;
148148
gdImagePtr im = 0;
149149

150+
memset(ColorMap, 0, 3 * MAXCOLORMAPSIZE);
151+
memset(localColorMap, 0, 3 * MAXCOLORMAPSIZE);
152+
150153
/*1.4//imageNumber = 1; */
151154
if (! ReadOK(fd,buf,6)) {
152155
return 0;

ext/gd/tests/bug74435.gif

11.2 KB
Loading

ext/gd/tests/bug74435.phpt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
Bug #74435 (Buffer over-read into uninitialized memory)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('gd')) die('skip gd extension not available');
6+
?>
7+
--FILE--
8+
<?php
9+
$im = imagecreatefromgif(__DIR__ . DIRECTORY_SEPARATOR . 'bug74435.gif');
10+
var_dump($im);
11+
$width = imagesx($im);
12+
$height = imagesy($im);
13+
for ($i = 0; $i < $width; $i += 16) {
14+
for ($j = 0; $j < $height; $j += 16) {
15+
if (($index = imagecolorat($im, $i, $j)) >= 2) {
16+
list($red, $green, $blue, $alpha) = array_values(imagecolorsforindex($im, $index));
17+
if ($red !== 0 || $green !== 0 || $blue !== 0 || $alpha !== 0) {
18+
echo "unexpected color at ($i, $j)\n";
19+
}
20+
}
21+
}
22+
}
23+
?>
24+
===DONE===
25+
--EXPECTF--
26+
resource(%d) of type (gd)
27+
===DONE===

0 commit comments

Comments
 (0)