]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
varlink: add helper that validates a qualified Varlink symbol name
authorLennart Poettering <lennart@poettering.net>
Mon, 27 May 2024 20:31:09 +0000 (22:31 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 20 Jun 2024 16:20:09 +0000 (18:20 +0200)
Qualified Varlink symbol names are the combination of an interface name,
followed by a dot, followed by a symbol name. It's a primary concept,
after all it's what we send over the wire for method calls and get back
for error returns.

hence, let's add an explicit validator for it.

src/shared/varlink-idl.c
src/shared/varlink-idl.h
src/test/test-varlink-idl.c

index 57765b18c298573a22acf798cafe55731bbecf7a..f81c38c53ddf4bf4c82799ac420e5d9f8a8aba4e 100644 (file)
@@ -1452,6 +1452,28 @@ static bool varlink_idl_comment_is_valid(const char *comment) {
         return utf8_is_valid(comment);
 }
 
+int varlink_idl_qualified_symbol_name_is_valid(const char *name) {
+        const char *dot;
+
+        /* Validates a qualified symbol name (i.e. interface name, followed by a dot, followed by a symbol name) */
+
+        if (!name)
+                return false;
+
+        dot = strrchr(name, '.');
+        if (!dot)
+                return false;
+
+        if (!varlink_idl_symbol_name_is_valid(dot + 1))
+                return false;
+
+        _cleanup_free_ char *iface = strndup(name, dot - name);
+        if (!iface)
+                return -ENOMEM;
+
+        return varlink_idl_interface_name_is_valid(iface);
+}
+
 static int varlink_idl_symbol_consistent(const VarlinkInterface *interface, const VarlinkSymbol *symbol, int level);
 
 static int varlink_idl_field_consistent(
index 03a1a2b2e484976262ec9a02e604138ff173ab6c..ffb55f30663d9224dc7e8b89a8d4d093b8e3f531 100644 (file)
@@ -170,6 +170,8 @@ bool varlink_idl_field_name_is_valid(const char *name);
 bool varlink_idl_symbol_name_is_valid(const char *name);
 bool varlink_idl_interface_name_is_valid(const char *name);
 
+int varlink_idl_qualified_symbol_name_is_valid(const char *name);
+
 int varlink_idl_consistent(const VarlinkInterface *interface, int level);
 
 const VarlinkSymbol* varlink_idl_find_symbol(const VarlinkInterface *interface, VarlinkSymbolType type, const char *name);
index f14622bd58137af173613a3d94f487576a81284b..c2be1dfec04f60b1324fce6ad1938cc4bebcf196 100644 (file)
@@ -261,6 +261,17 @@ TEST(field_name_is_valid) {
         assert_se(varlink_idl_field_name_is_valid("foo0foo"));
 }
 
+TEST(qualified_symbol_name_is_valid) {
+        assert_se(varlink_idl_qualified_symbol_name_is_valid(NULL) == 0);
+        assert_se(varlink_idl_qualified_symbol_name_is_valid("") == 0);
+        assert_se(varlink_idl_qualified_symbol_name_is_valid("x") == 0);
+        assert_se(varlink_idl_qualified_symbol_name_is_valid("xxx") == 0);
+        assert_se(varlink_idl_qualified_symbol_name_is_valid("xxx.xxx") == 0);
+        assert_se(varlink_idl_qualified_symbol_name_is_valid("xxx.Xxx") > 0);
+        assert_se(varlink_idl_qualified_symbol_name_is_valid("xxx.xxx.XXX") > 0);
+        assert_se(varlink_idl_qualified_symbol_name_is_valid("xxx.xxx.0foo") == 0);
+}
+
 TEST(validate_json) {
 
         _cleanup_(varlink_interface_freep) VarlinkInterface *parsed = NULL;