Skip to content

Commit f892845

Browse files
committed
Merge branch 'PHP-8.2'
2 parents 1ea8c82 + dedaf40 commit f892845

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
@@ -593,6 +593,12 @@ PHP_FUNCTION(imageloadfont)
593593
font->w = FLIPWORD(font->w);
594594
font->h = FLIPWORD(font->h);
595595
font->nchars = FLIPWORD(font->nchars);
596+
if (overflow2(font->nchars, font->h) || overflow2(font->nchars * font->h, font->w )) {
597+
php_error_docref(NULL, E_WARNING, "Error reading font, invalid font header");
598+
efree(font);
599+
php_stream_close(stream);
600+
RETURN_FALSE;
601+
}
596602
body_size = font->w * font->h * font->nchars;
597603
}
598604

@@ -603,6 +609,7 @@ PHP_FUNCTION(imageloadfont)
603609
RETURN_FALSE;
604610
}
605611

612+
ZEND_ASSERT(body_size > 0);
606613
font->data = emalloc(body_size);
607614
b = 0;
608615
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)