1
0
mirror of https://github.com/systemd/systemd synced 2024-07-01 07:34:28 +00:00

varlink: add helper that validates a qualified Varlink symbol name

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.
This commit is contained in:
Lennart Poettering 2024-05-27 22:31:09 +02:00
parent 912730a2d5
commit 296027122b
3 changed files with 35 additions and 0 deletions

View 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(

View 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);

View 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;