Skip to content

Commit 1d83a40

Browse files
committed
Merge branch 'PHP-7.4' into PHP-8.0
2 parents 45e224c + d50532b commit 1d83a40

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
@@ -686,6 +686,12 @@ PHP_FUNCTION(imageloadfont)
686686
font->w = FLIPWORD(font->w);
687687
font->h = FLIPWORD(font->h);
688688
font->nchars = FLIPWORD(font->nchars);
689+
if (overflow2(font->nchars, font->h) || overflow2(font->nchars * font->h, font->w )) {
690+
php_error_docref(NULL, E_WARNING, "Error reading font, invalid font header");
691+
efree(font);
692+
php_stream_close(stream);
693+
RETURN_FALSE;
694+
}
689695
body_size = font->w * font->h * font->nchars;
690696
}
691697

@@ -696,6 +702,7 @@ PHP_FUNCTION(imageloadfont)
696702
RETURN_FALSE;
697703
}
698704

705+
ZEND_ASSERT(body_size > 0);
699706
font->data = emalloc(body_size);
700707
b = 0;
701708
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)