File tree Expand file tree Collapse file tree 2 files changed +31
-0
lines changed Expand file tree Collapse file tree 2 files changed +31
-0
lines changed Original file line number Diff line number Diff 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 ) {
Original file line number Diff line number Diff line change 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)
You can’t perform that action at this time.
0 commit comments