mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-26 15:36:14 +01:00
gdbus-codegen: Handle unexpected XML tags
This was reported in bug 650874. Add tests. https://bugzilla.gnome.org/show_bug.cgi?id=650874 Signed-off-by: David Zeuthen <davidz@redhat.com>
This commit is contained in:
parent
0aae977ac1
commit
263ce3042c
@ -35,6 +35,7 @@ class DBusXMLParser:
|
|||||||
STATE_PROPERTY = 'property'
|
STATE_PROPERTY = 'property'
|
||||||
STATE_ARG = 'arg'
|
STATE_ARG = 'arg'
|
||||||
STATE_ANNOTATION = 'annotation'
|
STATE_ANNOTATION = 'annotation'
|
||||||
|
STATE_IGNORED = 'ignored'
|
||||||
|
|
||||||
def __init__(self, xml_data):
|
def __init__(self, xml_data):
|
||||||
self._parser = xml.parsers.expat.ParserCreate()
|
self._parser = xml.parsers.expat.ParserCreate()
|
||||||
@ -129,11 +130,13 @@ class DBusXMLParser:
|
|||||||
def handle_start_element(self, name, attrs):
|
def handle_start_element(self, name, attrs):
|
||||||
old_state = self.state
|
old_state = self.state
|
||||||
old_cur_object = self._cur_object
|
old_cur_object = self._cur_object
|
||||||
if self.state == DBusXMLParser.STATE_TOP:
|
if self.state == DBusXMLParser.STATE_IGNORED:
|
||||||
|
self.state = DBusXMLParser.STATE_IGNORED
|
||||||
|
elif self.state == DBusXMLParser.STATE_TOP:
|
||||||
if name == DBusXMLParser.STATE_NODE:
|
if name == DBusXMLParser.STATE_NODE:
|
||||||
self.state = DBusXMLParser.STATE_NODE
|
self.state = DBusXMLParser.STATE_NODE
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('Cannot go from state "%s" to element with name "%s"'%(self.state, name))
|
self.state = DBusXMLParser.STATE_IGNORED
|
||||||
elif self.state == DBusXMLParser.STATE_NODE:
|
elif self.state == DBusXMLParser.STATE_NODE:
|
||||||
if name == DBusXMLParser.STATE_INTERFACE:
|
if name == DBusXMLParser.STATE_INTERFACE:
|
||||||
self.state = DBusXMLParser.STATE_INTERFACE
|
self.state = DBusXMLParser.STATE_INTERFACE
|
||||||
@ -146,10 +149,10 @@ class DBusXMLParser:
|
|||||||
self._cur_object.annotations.append(anno)
|
self._cur_object.annotations.append(anno)
|
||||||
self._cur_object = anno
|
self._cur_object = anno
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('Cannot go from state "%s" to element with name "%s"'%(self.state, name))
|
self.state = DBusXMLParser.STATE_IGNORED
|
||||||
|
|
||||||
# assign docs, if any
|
# assign docs, if any
|
||||||
if self.doc_comment_last_symbol == attrs['name']:
|
if attrs.has_key('name') and self.doc_comment_last_symbol == attrs['name']:
|
||||||
self._cur_object.doc_string = self.doc_comment_body
|
self._cur_object.doc_string = self.doc_comment_body
|
||||||
if self.doc_comment_params.has_key('short_description'):
|
if self.doc_comment_params.has_key('short_description'):
|
||||||
short_description = self.doc_comment_params['short_description']
|
short_description = self.doc_comment_params['short_description']
|
||||||
@ -179,7 +182,7 @@ class DBusXMLParser:
|
|||||||
self._cur_object.annotations.append(anno)
|
self._cur_object.annotations.append(anno)
|
||||||
self._cur_object = anno
|
self._cur_object = anno
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('Cannot go from state "%s" to element with name "%s"'%(self.state, name))
|
self.state = DBusXMLParser.STATE_IGNORED
|
||||||
|
|
||||||
# assign docs, if any
|
# assign docs, if any
|
||||||
if attrs.has_key('name') and self.doc_comment_last_symbol == attrs['name']:
|
if attrs.has_key('name') and self.doc_comment_last_symbol == attrs['name']:
|
||||||
@ -208,7 +211,7 @@ class DBusXMLParser:
|
|||||||
self._cur_object.annotations.append(anno)
|
self._cur_object.annotations.append(anno)
|
||||||
self._cur_object = anno
|
self._cur_object = anno
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('Cannot go from state "%s" to element with name "%s"'%(self.state, name))
|
self.state = DBusXMLParser.STATE_IGNORED
|
||||||
|
|
||||||
# assign docs, if any
|
# assign docs, if any
|
||||||
if self.doc_comment_last_symbol == old_cur_object.name:
|
if self.doc_comment_last_symbol == old_cur_object.name:
|
||||||
@ -234,7 +237,7 @@ class DBusXMLParser:
|
|||||||
self._cur_object.annotations.append(anno)
|
self._cur_object.annotations.append(anno)
|
||||||
self._cur_object = anno
|
self._cur_object = anno
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('Cannot go from state "%s" to element with name "%s"'%(self.state, name))
|
self.state = DBusXMLParser.STATE_IGNORED
|
||||||
|
|
||||||
# assign docs, if any
|
# assign docs, if any
|
||||||
if self.doc_comment_last_symbol == old_cur_object.name:
|
if self.doc_comment_last_symbol == old_cur_object.name:
|
||||||
@ -252,7 +255,8 @@ class DBusXMLParser:
|
|||||||
self._cur_object.annotations.append(anno)
|
self._cur_object.annotations.append(anno)
|
||||||
self._cur_object = anno
|
self._cur_object = anno
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('Cannot go from state "%s" to element with name "%s"'%(self.state, name))
|
self.state = DBusXMLParser.STATE_IGNORED
|
||||||
|
|
||||||
elif self.state == DBusXMLParser.STATE_ARG:
|
elif self.state == DBusXMLParser.STATE_ARG:
|
||||||
if name == DBusXMLParser.STATE_ANNOTATION:
|
if name == DBusXMLParser.STATE_ANNOTATION:
|
||||||
self.state = DBusXMLParser.STATE_ANNOTATION
|
self.state = DBusXMLParser.STATE_ANNOTATION
|
||||||
@ -260,7 +264,8 @@ class DBusXMLParser:
|
|||||||
self._cur_object.annotations.append(anno)
|
self._cur_object.annotations.append(anno)
|
||||||
self._cur_object = anno
|
self._cur_object = anno
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('Cannot go from state "%s" to element with name "%s"'%(self.state, name))
|
self.state = DBusXMLParser.STATE_IGNORED
|
||||||
|
|
||||||
elif self.state == DBusXMLParser.STATE_ANNOTATION:
|
elif self.state == DBusXMLParser.STATE_ANNOTATION:
|
||||||
if name == DBusXMLParser.STATE_ANNOTATION:
|
if name == DBusXMLParser.STATE_ANNOTATION:
|
||||||
self.state = DBusXMLParser.STATE_ANNOTATION
|
self.state = DBusXMLParser.STATE_ANNOTATION
|
||||||
@ -268,7 +273,8 @@ class DBusXMLParser:
|
|||||||
self._cur_object.annotations.append(anno)
|
self._cur_object.annotations.append(anno)
|
||||||
self._cur_object = anno
|
self._cur_object = anno
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('Cannot go from state "%s" to element with name "%s"'%(self.state, name))
|
self.state = DBusXMLParser.STATE_IGNORED
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('Unhandled state "%s" while entering element with name "%s"'%(self.state, name))
|
raise RuntimeError('Unhandled state "%s" while entering element with name "%s"'%(self.state, name))
|
||||||
|
|
||||||
|
@ -444,4 +444,27 @@
|
|||||||
</property>
|
</property>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
|
<!-- ensure we don't choke on unknown/unexpected XML tags or unknown/unexpected attribyutes (#650874) -->
|
||||||
|
<interface name="UnknownXmlTags" unexpected="boo">
|
||||||
|
<someUnknownTag>
|
||||||
|
<anotherTagWeIgnore>yadaydaydaydayda</anotherTagWeIgnore>
|
||||||
|
</someUnknownTag>
|
||||||
|
<method name="CanSetTimezone" also_unexpected="1">
|
||||||
|
<annotation name="org.freedesktop.DBus.GLib.Async" value="" also_unexpected="1">
|
||||||
|
<unknownTag/>
|
||||||
|
</annotation>
|
||||||
|
<arg name="value" direction="out" type="i" also_unexpected="1">
|
||||||
|
<unknownTag/>
|
||||||
|
</arg>
|
||||||
|
<unknownTag/>
|
||||||
|
</method>
|
||||||
|
<signal name="SomeSignal" also_unexpected="1">
|
||||||
|
<unknownTag/>
|
||||||
|
</signal>
|
||||||
|
<property name="SomeProperty" type="s" access="readwrite" also_unexpected="1">
|
||||||
|
<unknownTag/>
|
||||||
|
</property>
|
||||||
|
</interface>
|
||||||
|
<unknownTag/>
|
||||||
|
|
||||||
</node>
|
</node>
|
||||||
|
Loading…
Reference in New Issue
Block a user