Limit expected number of characters to nencoding

This commit is contained in:
Andrew Murray 2022-06-27 14:03:20 +10:00
parent ce486e77b1
commit 93805d5257
3 changed files with 12 additions and 8 deletions

Binary file not shown.

View File

@ -49,6 +49,14 @@ def test_sanity(request, tmp_path):
save_font(request, tmp_path) save_font(request, tmp_path)
def test_less_than_256_characters():
with open("Tests/fonts/10x20-ISO8859-1-fewer-characters.pcf", "rb") as test_file:
font = PcfFontFile.PcfFontFile(test_file)
assert isinstance(font, FontFile.FontFile)
# check the number of characters in the font
assert len([_f for _f in font.glyph if _f]) == 127
def test_invalid_file(): def test_invalid_file():
with open("Tests/images/flower.jpg", "rb") as fp: with open("Tests/images/flower.jpg", "rb") as fp:
with pytest.raises(SyntaxError): with pytest.raises(SyntaxError):

View File

@ -84,8 +84,7 @@ class PcfFontFile(FontFile.FontFile):
# #
# create glyph structure # create glyph structure
for ch in range(256): for ch, ix in enumerate(encoding):
ix = encoding[ch]
if ix is not None: if ix is not None:
x, y, l, r, w, a, d, f = metrics[ix] x, y, l, r, w, a, d, f = metrics[ix]
glyph = (w, 0), (l, d - y, x + l, d), (0, 0, x, y), bitmaps[ix] glyph = (w, 0), (l, d - y, x + l, d), (0, 0, x, y), bitmaps[ix]
@ -219,10 +218,6 @@ class PcfFontFile(FontFile.FontFile):
return bitmaps return bitmaps
def _load_encoding(self): def _load_encoding(self):
# map character code to bitmap index
encoding = [None] * 256
fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS)
first_col, last_col = i16(fp.read(2)), i16(fp.read(2)) first_col, last_col = i16(fp.read(2)), i16(fp.read(2))
@ -232,6 +227,9 @@ class PcfFontFile(FontFile.FontFile):
nencoding = (last_col - first_col + 1) * (last_row - first_row + 1) nencoding = (last_col - first_col + 1) * (last_row - first_row + 1)
# map character code to bitmap index
encoding = [None] * min(256, nencoding)
encoding_offsets = [i16(fp.read(2)) for _ in range(nencoding)] encoding_offsets = [i16(fp.read(2)) for _ in range(nencoding)]
for i in range(first_col, len(encoding)): for i in range(first_col, len(encoding)):
@ -244,7 +242,5 @@ class PcfFontFile(FontFile.FontFile):
except UnicodeDecodeError: except UnicodeDecodeError:
# character is not supported in selected encoding # character is not supported in selected encoding
pass pass
except IndexError:
break
return encoding return encoding