Skip to content

Commit feb586e

Browse files
cmb69Gabriel Caruso
authored andcommitted
Fix #81739: OOB read due to insufficient validation in imageloadfont()
If we swap the byte order of the relevant header bytes, we need to make sure again that the following multiplication does not overflow.
1 parent b7cbb6c commit feb586e

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

ext/gd/gd.c

Lines changed: 7 additions & 0 deletions
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

Lines changed: 24 additions & 0 deletions
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)