From d8b5bc474a7cddbe8fbebc0b5633c539851b452f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Noel?= Date: Thu, 26 Jun 2025 17:46:00 +0200 Subject: [PATCH 1/2] varlink/scanner.py: fix enum values not being checked. Fixes #65. --- varlink/scanner.py | 3 ++- varlink/tests/test_scanner.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/varlink/scanner.py b/varlink/scanner.py index b9c98e1..606d399 100644 --- a/varlink/scanner.py +++ b/varlink/scanner.py @@ -307,7 +307,8 @@ def filter_params(self, parent_name, varlink_type, _namespaced, args, kwargs): return args if isinstance(varlink_type, _Enum) and isinstance(args, str): - # print("Returned str:", args) + if args not in varlink_type.fields: + raise InvalidParameter(parent_name) return args if isinstance(varlink_type, _Array): diff --git a/varlink/tests/test_scanner.py b/varlink/tests/test_scanner.py index cb4e95e..1a2f399 100755 --- a/varlink/tests/test_scanner.py +++ b/varlink/tests/test_scanner.py @@ -121,3 +121,14 @@ def test_interfacename(self): self.assertIsNotNone( varlink.Interface("interface xn--c1yn36f.xn--c1yn36f.xn--c1yn36f\nmethod F()->()").name ) + + def test_bad_types(self): + interface = varlink.Interface(""" + interface org.example.testerrors + type TypeEnum ( a, b, c ) + + method Foo(param: TypeEnum) -> () + """) + foo = interface.get_method("Foo") + with self.assertRaises(varlink.InvalidParameter): + interface.filter_params("test.call", foo.in_type, False, (), {"param": "d"}) From 6ddd6589ee5b50ca7d0bd2091093faa5f819d5e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Noel?= Date: Thu, 26 Jun 2025 21:47:03 +0200 Subject: [PATCH 2/2] varlink/scanner.py: early exit in case of invalid dict. No behaviour change since the scanner would end up returning InvalidParam anyway after exhausting all other possible types. --- varlink/scanner.py | 2 +- varlink/tests/test_scanner.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/varlink/scanner.py b/varlink/scanner.py index 606d399..f1c766b 100644 --- a/varlink/scanner.py +++ b/varlink/scanner.py @@ -291,7 +291,7 @@ def filter_params(self, parent_name, varlink_type, _namespaced, args, kwargs): ) return args else: - InvalidParameter(parent_name) + raise InvalidParameter(parent_name) if isinstance(varlink_type, _CustomType): # print("CustomType", varlink_type.name) diff --git a/varlink/tests/test_scanner.py b/varlink/tests/test_scanner.py index 1a2f399..4beee24 100755 --- a/varlink/tests/test_scanner.py +++ b/varlink/tests/test_scanner.py @@ -126,9 +126,14 @@ def test_bad_types(self): interface = varlink.Interface(""" interface org.example.testerrors type TypeEnum ( a, b, c ) + type TypeDict (dict: [string]string) method Foo(param: TypeEnum) -> () + method Bar(param: TypeDict) -> () """) foo = interface.get_method("Foo") with self.assertRaises(varlink.InvalidParameter): interface.filter_params("test.call", foo.in_type, False, (), {"param": "d"}) + bar = interface.get_method("Bar") + with self.assertRaises(varlink.InvalidParameter): + interface.filter_params("test.call", bar.in_type, False, (), {"param": {"dict": [1, 2, 3]}})