Skip to content

Commit 33e10cb

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
2 parents fe06c5e + 1d83a40 commit 33e10cb

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

ext/gd/gd.c

+7
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,12 @@ PHP_FUNCTION(imageloadfont)
743743
font->w = FLIPWORD(font->w);
744744
font->h = FLIPWORD(font->h);
745745
font->nchars = FLIPWORD(font->nchars);
746+
if (overflow2(font->nchars, font->h) || overflow2(font->nchars * font->h, font->w )) {
747+
php_error_docref(NULL, E_WARNING, "Error reading font, invalid font header");
748+
efree(font);
749+
php_stream_close(stream);
750+
RETURN_FALSE;
751+
}
746752
body_size = font->w * font->h * font->nchars;
747753
}
748754

@@ -753,6 +759,7 @@ PHP_FUNCTION(imageloadfont)
753759
RETURN_FALSE;
754760
}
755761

762+
ZEND_ASSERT(body_size > 0);
756763
font->data = emalloc(body_size);
757764
b = 0;
758765
while (b < body_size && (n = php_stream_read(stream, &font->data[b], body_size - b)) > 0) {

ext/gd/tests/bug81739.phpt

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
Bug #81739 (OOB read due to insufficient validation in imageloadfont())
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded("gd")) die("skip gd extension not available");
6+
?>
7+
--FILE--
8+
<?php
9+
$s = fopen(__DIR__ . "/font.font", "w");
10+
// header without character data
11+
fwrite($s, "\x01\x00\x00\x00\x20\x00\x00\x00\x08\x00\x00\x00\x08\x00\x00\x00");
12+
fclose($s);
13+
var_dump(imageloadfont(__DIR__ . "/font.font"));
14+
?>
15+
--CLEAN--
16+
<?php
17+
@unlink(__DIR__ . "/font.font");
18+
?>
19+
--EXPECTF--
20+
Warning: imageloadfont(): %croduct of memory allocation multiplication would exceed INT_MAX, failing operation gracefully
21+
in %s on line %d
22+
23+
Warning: imageloadfont(): Error reading font, invalid font header in %s on line %d
24+
bool(false)

0 commit comments

Comments
 (0)