[voltLib] Don’t try to read past END

The parser was still trying to read the next token even when the current
token was END, but I think it should just stop reading here. When
reading from TSIV table there can be null bytes at the end when would
cause an exception in the lexer.
This commit is contained in:
Khaled Hosny 2019-01-16 23:04:14 +02:00
parent a3dd59d6ea
commit e529832362
2 changed files with 11 additions and 4 deletions

View File

@ -44,10 +44,7 @@ class Parser(object):
func = getattr(self, PARSE_FUNCS[self.cur_token_]) func = getattr(self, PARSE_FUNCS[self.cur_token_])
statements.append(func()) statements.append(func())
elif self.is_cur_keyword_("END"): elif self.is_cur_keyword_("END"):
if self.next_token_type_ is not None: break
raise VoltLibError("Expected the end of the file",
self.cur_token_location_)
return self.doc_
else: else:
raise VoltLibError( raise VoltLibError(
"Expected " + ", ".join(sorted(PARSE_FUNCS.keys())), "Expected " + ", ".join(sorted(PARSE_FUNCS.keys())),
@ -602,6 +599,8 @@ class Parser(object):
self.cur_token_type_, self.cur_token_, self.cur_token_location_ = ( self.cur_token_type_, self.cur_token_, self.cur_token_location_ = (
self.next_token_type_, self.next_token_, self.next_token_location_) self.next_token_type_, self.next_token_, self.next_token_location_)
try: try:
if self.is_cur_keyword_("END"):
raise StopIteration
(self.next_token_type_, self.next_token_, (self.next_token_type_, self.next_token_,
self.next_token_location_) = self.lexer_.next() self.next_token_location_) = self.lexer_.next()
except StopIteration: except StopIteration:

View File

@ -1028,6 +1028,14 @@ class ParserTest(unittest.TestCase):
("CMAP_FORMAT", (3, 1, 4))) ("CMAP_FORMAT", (3, 1, 4)))
) )
def test_stop_at_end(self):
[def_glyph] = self.parse(
'DEF_GLYPH ".notdef" ID 0 TYPE BASE END_GLYPH END\0\0\0\0'
).statements
self.assertEqual((def_glyph.name, def_glyph.id, def_glyph.unicode,
def_glyph.type, def_glyph.components),
(".notdef", 0, None, "BASE", None))
def setUp(self): def setUp(self):
self.tempdir = None self.tempdir = None
self.num_tempfiles = 0 self.num_tempfiles = 0