diff --git a/src/shared/varlink-idl.c b/src/shared/varlink-idl.c index 57765b18c2..f81c38c53d 100644 --- a/src/shared/varlink-idl.c +++ b/src/shared/varlink-idl.c @@ -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( diff --git a/src/shared/varlink-idl.h b/src/shared/varlink-idl.h index 03a1a2b2e4..ffb55f3066 100644 --- a/src/shared/varlink-idl.h +++ b/src/shared/varlink-idl.h @@ -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); diff --git a/src/test/test-varlink-idl.c b/src/test/test-varlink-idl.c index f14622bd58..c2be1dfec0 100644 --- a/src/test/test-varlink-idl.c +++ b/src/test/test-varlink-idl.c @@ -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;