mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2026-05-01 19:37:58 +02:00
path_prefix: anchor matches at path-component boundaries, and give examples
It seems wrong that path_prefix="/foo" matches /foobar, and it isn't difficult or expensive to check.
This commit is contained in:
parent
0980e63aac
commit
d23cdacb0d
2 changed files with 40 additions and 5 deletions
|
|
@ -1801,6 +1801,7 @@ match_rule_matches (BusMatchRule *rule,
|
|||
if (flags & BUS_MATCH_PATH_PREFIX)
|
||||
{
|
||||
const char *path;
|
||||
int len;
|
||||
|
||||
_dbus_assert (rule->path_prefix != NULL);
|
||||
|
||||
|
|
@ -1810,6 +1811,17 @@ match_rule_matches (BusMatchRule *rule,
|
|||
|
||||
if (!str_has_prefix (path, rule->path_prefix))
|
||||
return FALSE;
|
||||
|
||||
len = strlen (rule->path_prefix);
|
||||
|
||||
/* Check that the actual argument is within the expected
|
||||
* namespace, rather than just starting with that string,
|
||||
* by checking that the matched prefix either ends in a '/',
|
||||
* or is followed by a '/' or the end of the path.
|
||||
*/
|
||||
if (rule->path_prefix[len - 1] != '/' &&
|
||||
path[len] != '\0' && path[len] != '/')
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (flags & BUS_MATCH_ARGS)
|
||||
|
|
@ -2736,12 +2748,12 @@ path_prefix_should_not_match_message_2[] = {
|
|||
|
||||
static const char*
|
||||
path_prefix_should_match_message_3[] = {
|
||||
"type='signal',path_prefix='/foo/TheObjectManager'",
|
||||
NULL
|
||||
};
|
||||
|
||||
static const char*
|
||||
path_prefix_should_not_match_message_3[] = {
|
||||
"type='signal',path_prefix='/foo/TheObjectManager'",
|
||||
"type='signal',path_prefix='/foo/TheObjectManager/'",
|
||||
NULL
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3727,10 +3727,33 @@
|
|||
<entry>
|
||||
<para>
|
||||
Matches messages which are sent from or to an
|
||||
object for which the object path is a prefix of
|
||||
the given value. Examples of matches are
|
||||
path_prefix='/org/Application/ObjectManager' or
|
||||
path_prefix='/org/Application/ContactObjects/'.
|
||||
object for which the object path is a descendant of
|
||||
the given value. If the prefix ends with a slash, it
|
||||
matches all paths starting with that string;
|
||||
if it does not end with a slash, it matches either
|
||||
that exact path, or that path followed by one or
|
||||
more path components.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For example,
|
||||
<literal>path_prefix='/com/example/foo'</literal>
|
||||
would match signals sent by
|
||||
<literal>/com/example/foo</literal>
|
||||
or by
|
||||
<literal>/com/example/foo/bar</literal>,
|
||||
but not by
|
||||
<literal>/com/example/foobar</literal>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
However,
|
||||
<literal>path_prefix='/com/example/foo/'</literal>
|
||||
would still match signals sent by
|
||||
<literal>/com/example/foo/bar</literal>,
|
||||
but would not match signals sent by
|
||||
<literal>/com/example/foo</literal> or
|
||||
<literal>/com/example/foobar</literal>.
|
||||
</para>
|
||||
<para>
|
||||
<emphasis>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue