diff options
author | Will Thompson <will.thompson@collabora.co.uk> | 2010-11-21 16:34:51 +0000 |
---|---|---|
committer | Will Thompson <will.thompson@collabora.co.uk> | 2010-11-23 10:57:22 +0000 |
commit | 613ecbfba04965bf48f78c3afbb9a99144cb6036 (patch) | |
tree | 39595aec21b4346e298723ebafbcaefbe8e026eb /bus | |
parent | 2f7b11158b497e759cd03664b1881f88157a9f1a (diff) |
Validate arg0namespace matches' values.
I could be convinced that this is overkill, but it seems sensible to
forbid obviously-broken arg0namespace matches.
Diffstat (limited to 'bus')
-rw-r--r-- | bus/signals.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/bus/signals.c b/bus/signals.c index 9939a23e..daf85403 100644 --- a/bus/signals.c +++ b/bus/signals.c @@ -771,7 +771,22 @@ bus_match_rule_parse_arg_match (BusMatchRule *rule, } else if (_dbus_string_equal_c_str (&key_str, "arg0namespace")) { + int value_len = _dbus_string_get_length (value); + is_namespace = TRUE; + + if (value_len > 0 && + _dbus_string_get_byte (value, value_len - 1) == '.') + value_len--; + + if (!_dbus_validate_bus_namespace (value, 0, value_len)) + { + dbus_set_error (error, DBUS_ERROR_MATCH_RULE_INVALID, + "arg0namespace='%s' is not a valid (optionally " + "period-terminated) prefix of a bus name", + _dbus_string_get_const_data (value)); + goto failed; + } } else { @@ -2109,9 +2124,62 @@ test_parsing (void *data) bus_match_rule_unref (rule); } + rule = check_parse (TRUE, "arg0namespace='foo.'"); + if (rule != NULL) + { + _dbus_assert (rule->flags == BUS_MATCH_ARGS); + _dbus_assert (rule->args != NULL); + _dbus_assert (rule->args_len == 1); + _dbus_assert (strcmp (rule->args[0], "foo.") == 0); + _dbus_assert ((rule->arg_lens[0] & BUS_MATCH_ARG_NAMESPACE) + == BUS_MATCH_ARG_NAMESPACE); + + bus_match_rule_unref (rule); + } + + rule = check_parse (TRUE, "arg0namespace='foo.bar'"); + if (rule != NULL) + { + _dbus_assert (rule->flags == BUS_MATCH_ARGS); + _dbus_assert (rule->args != NULL); + _dbus_assert (rule->args_len == 1); + _dbus_assert (strcmp (rule->args[0], "foo.bar") == 0); + _dbus_assert ((rule->arg_lens[0] & BUS_MATCH_ARG_NAMESPACE) + == BUS_MATCH_ARG_NAMESPACE); + + bus_match_rule_unref (rule); + } + + rule = check_parse (TRUE, "arg0namespace='foo.bar.'"); + if (rule != NULL) + { + _dbus_assert (rule->flags == BUS_MATCH_ARGS); + _dbus_assert (rule->args != NULL); + _dbus_assert (rule->args_len == 1); + _dbus_assert (strcmp (rule->args[0], "foo.bar.") == 0); + _dbus_assert ((rule->arg_lens[0] & BUS_MATCH_ARG_NAMESPACE) + == BUS_MATCH_ARG_NAMESPACE); + + bus_match_rule_unref (rule); + } + + /* Only arg0namespace is supported. */ rule = check_parse (FALSE, "arg1namespace='foo'"); _dbus_assert (rule == NULL); + /* An empty string isn't a valid namespace prefix (you should just not + * specify this key at all). + */ + rule = check_parse (FALSE, "arg0namespace=''"); + _dbus_assert (rule == NULL); + + /* Two trailing periods on otherwise-valid namespaces aren't allowed. */ + rule = check_parse (FALSE, "arg0namespace='foo..'"); + _dbus_assert (rule == NULL); + + rule = check_parse (FALSE, "arg0namespace='foo.bar..'"); + _dbus_assert (rule == NULL); + /* Too-large argN */ rule = check_parse (FALSE, "arg300='foo'"); _dbus_assert (rule == NULL); |