mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-28 02:04:36 +03:00
Merge pull request #6846 from radarhere/font_crash
Fixed null pointer dereference crash with malformed font
This commit is contained in:
commit
c4cc48764a
10
Tests/fonts/fuzz_font-5203009437302784
Normal file
10
Tests/fonts/fuzz_font-5203009437302784
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
STARTFONT
|
||||||
|
FONT ÿ
|
||||||
|
SIZE 10
|
||||||
|
FONTBOUNDINGBOX
|
||||||
|
CHARS
|
||||||
|
STARTCHAR
|
||||||
|
ENCODING
|
||||||
|
BBX 2 5
|
||||||
|
ENDCHAR
|
||||||
|
ENDFONT
|
|
@ -57,6 +57,6 @@ def test_fuzz_fonts(path):
|
||||||
with open(path, "rb") as f:
|
with open(path, "rb") as f:
|
||||||
try:
|
try:
|
||||||
fuzzers.fuzz_font(f.read())
|
fuzzers.fuzz_font(f.read())
|
||||||
except (Image.DecompressionBombError, Image.DecompressionBombWarning):
|
except (Image.DecompressionBombError, Image.DecompressionBombWarning, OSError):
|
||||||
pass
|
pass
|
||||||
assert True
|
assert True
|
||||||
|
|
22
Tests/test_font_crash.py
Normal file
22
Tests/test_font_crash.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
|
||||||
|
from .helper import skip_unless_feature
|
||||||
|
|
||||||
|
|
||||||
|
class TestFontCrash:
|
||||||
|
def _fuzz_font(self, font):
|
||||||
|
# from fuzzers.fuzz_font
|
||||||
|
font.getbbox("ABC")
|
||||||
|
font.getmask("test text")
|
||||||
|
with Image.new(mode="RGBA", size=(200, 200)) as im:
|
||||||
|
draw = ImageDraw.Draw(im)
|
||||||
|
draw.multiline_textbbox((10, 10), "ABC\nAaaa", font, stroke_width=2)
|
||||||
|
draw.text((10, 10), "Test Text", font=font, fill="#000")
|
||||||
|
|
||||||
|
@skip_unless_feature("freetype2")
|
||||||
|
def test_segfault(self):
|
||||||
|
with pytest.raises(OSError):
|
||||||
|
font = ImageFont.truetype("Tests/fonts/fuzz_font-5203009437302784")
|
||||||
|
self._fuzz_font(font)
|
|
@ -921,6 +921,12 @@ font_render(FontObject *self, PyObject *args) {
|
||||||
yy = -(py + glyph_slot->bitmap_top);
|
yy = -(py + glyph_slot->bitmap_top);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Null buffer, is dereferenced in FT_Bitmap_Convert
|
||||||
|
if (!bitmap.buffer && bitmap.rows) {
|
||||||
|
PyErr_SetString(PyExc_OSError, "Bitmap missing for glyph");
|
||||||
|
goto glyph_error;
|
||||||
|
}
|
||||||
|
|
||||||
/* convert non-8bpp bitmaps */
|
/* convert non-8bpp bitmaps */
|
||||||
switch (bitmap.pixel_mode) {
|
switch (bitmap.pixel_mode) {
|
||||||
case FT_PIXEL_MODE_MONO:
|
case FT_PIXEL_MODE_MONO:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user