gdbus-codegen: Error on invalid dbus types

Introduce slightly modified (dbus specific) versions of
variant_is_signature and variant_type_string_scan in order to fail
early on bad type strings.
This commit is contained in:
Corey Berla
2023-07-10 09:29:03 -07:00
parent 4aa63defdf
commit a1a00a3071
2 changed files with 122 additions and 0 deletions

View File

@@ -627,6 +627,64 @@ G_END_DECLS
"2.64",
)
@unittest.skipIf(on_win32(), "requires /dev/stdout")
def test_dbus_types(self):
bad_types = [
"{vs}", # Bad dictionary key type
"(ss(s{{sv}s}))", # Bad dictionary key types
"{s", # Unterminated dictionary
"(s{sss})", # Unterminated dictionary
"z", # Bad type
"(ssms)", # Bad type
"(", # Unterminated tuple
"(((ss))", # Unterminated tuple
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas", # Too much recursion
"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((("
"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((s))"
"))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))"
"))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", # Too much recursion
"{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{"
"{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{sv}"
"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}"
"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}", # Too much recursion
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaa{sv})", # Too much recursion
"(ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
"ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
"ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
"ssssssssssssssssssssssssssssssssssssssssssssssssssssssssss)", # Too long
]
for t in bad_types:
interface_xml = f"""
<node>
<interface name="BadTypes">
<property type="{t}" name="BadPropertyType" access="read" />
</interface>
</node>"""
with self.assertRaises(subprocess.CalledProcessError):
self.runCodegenWithInterface(
interface_xml, "--output", "/dev/stdout", "--body"
)
good_types = [
"si{s{b(ybnqiuxtdh)}}{yv}{nv}{dv}",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas", # 128 Levels of recursion
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa{sv})", # 128 Levels of recursion
]
for t in good_types:
interface_xml = f"""
<node>
<interface name="GoodTypes">
<property type="{t}" name="GoodPropertyType" access="read" />
</interface>
</node>"""
result = self.runCodegenWithInterface(
interface_xml, "--output", "/dev/stdout", "--body"
)
self.assertEqual("", result.err)
@unittest.skipIf(on_win32(), "requires /dev/stdout")
def test_unix_fd_types_and_annotations(self):
"""Test an interface with `h` arguments, no annotation, and GLib < 2.64.