mirror of
https://github.com/systemd/systemd.git
synced 2025-01-21 22:04:01 +03:00
bus: allow omitting quotes for values in match strings
dbus-daemon allows this, the dbus specification doesn't explicitly say anything about it, so let's follow dbus-daemon on this.
This commit is contained in:
parent
e79e8afd62
commit
bc6422cbd1
@ -726,25 +726,31 @@ int bus_match_parse(
|
||||
enum bus_match_node_type t;
|
||||
unsigned j = 0;
|
||||
size_t value_allocated = 0;
|
||||
bool escaped = false;
|
||||
bool escaped = false, quoted;
|
||||
uint8_t u;
|
||||
|
||||
eq = strchr(p, '=');
|
||||
if (!eq)
|
||||
return -EINVAL;
|
||||
|
||||
if (eq[1] != '\'')
|
||||
return -EINVAL;
|
||||
|
||||
t = bus_match_node_type_from_string(p, eq - p);
|
||||
if (t < 0)
|
||||
return -EINVAL;
|
||||
|
||||
for (q = eq + 2;; q++) {
|
||||
quoted = eq[1] == '\'';
|
||||
|
||||
for (q = eq + 1 + quoted;; q++) {
|
||||
|
||||
if (*q == 0) {
|
||||
r = -EINVAL;
|
||||
goto fail;
|
||||
|
||||
if (quoted) {
|
||||
r = -EINVAL;
|
||||
goto fail;
|
||||
} else {
|
||||
if (value)
|
||||
value[j] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!escaped) {
|
||||
@ -752,10 +758,20 @@ int bus_match_parse(
|
||||
escaped = true;
|
||||
continue;
|
||||
}
|
||||
if (*q == '\'') {
|
||||
if (value)
|
||||
value[j] = 0;
|
||||
break;
|
||||
|
||||
if (quoted) {
|
||||
if (*q == '\'') {
|
||||
if (value)
|
||||
value[j] = 0;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (*q == ',') {
|
||||
if (value)
|
||||
value[j] = 0;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -801,12 +817,12 @@ int bus_match_parse(
|
||||
if (q[1] == 0)
|
||||
break;
|
||||
|
||||
if (q[1] != ',') {
|
||||
if (q[quoted] != ',') {
|
||||
r = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
p = q + 2;
|
||||
p = q + 1 + quoted;
|
||||
}
|
||||
|
||||
/* Order the whole thing, so that we always generate the same tree */
|
||||
|
@ -107,7 +107,7 @@ int main(int argc, char *argv[]) {
|
||||
assert_se(match_add(&root, "path_namespace='/foo/quux'", 11) >= 0);
|
||||
assert_se(match_add(&root, "arg1='two'", 12) >= 0);
|
||||
assert_se(match_add(&root, "member='waldo',arg2path='/prefix/'", 13) >= 0);
|
||||
assert_se(match_add(&root, "member='waldo',path='/foo/bar',arg3namespace='prefix'", 14) >= 0);
|
||||
assert_se(match_add(&root, "member=waldo,path='/foo/bar',arg3namespace='prefix'", 14) >= 0);
|
||||
|
||||
bus_match_dump(&root, 0);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user