From 6974ccd542d11ae5fb1e56dd3d753f2de5cc097e Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 27 Jul 2013 17:41:58 +0200 Subject: qapi.py: Fix schema parser to check syntax systematically Fixes at least the following parser bugs: * accepts any token in place of a colon * treats comma as optional * crashes when closing braces or brackets are missing Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Message-id: 1374939721-7876-7-git-send-email-armbru@redhat.com Signed-off-by: Anthony Liguori --- scripts/qapi.py | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) (limited to 'scripts') diff --git a/scripts/qapi.py b/scripts/qapi.py index 0b48a1e50a..12fb29a047 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -106,24 +106,42 @@ class QAPISchema: def get_members(self): expr = OrderedDict() - while self.tok != '}': + if self.tok == '}': + self.accept() + return expr + if self.tok != "'": + raise QAPISchemaError(self, 'Expected string or "}"') + while True: key = self.val self.accept() - self.accept() # : + if self.tok != ':': + raise QAPISchemaError(self, 'Expected ":"') + self.accept() expr[key] = self.get_expr() - if self.tok == ',': + if self.tok == '}': self.accept() - self.accept() - return expr + return expr + if self.tok != ',': + raise QAPISchemaError(self, 'Expected "," or "}"') + self.accept() + if self.tok != "'": + raise QAPISchemaError(self, 'Expected string') def get_values(self): expr = [] - while self.tok != ']': + if self.tok == ']': + self.accept() + return expr + if not self.tok in [ '{', '[', "'" ]: + raise QAPISchemaError(self, 'Expected "{", "[", "]" or string') + while True: expr.append(self.get_expr()) - if self.tok == ',': + if self.tok == ']': self.accept() - self.accept() - return expr + return expr + if self.tok != ',': + raise QAPISchemaError(self, 'Expected "," or "]"') + self.accept() def get_expr(self): if self.tok == '{': @@ -132,9 +150,11 @@ class QAPISchema: elif self.tok == '[': self.accept() expr = self.get_values() - else: + elif self.tok == "'": expr = self.val self.accept() + else: + raise QAPISchemaError(self, 'Expected "{", "[" or string') return expr def parse_schema(fp): -- cgit v1.2.1