diff options
Diffstat (limited to 'src/libsystemd-bus')
-rw-r--r-- | src/libsystemd-bus/bus-match.c | 42 | ||||
-rw-r--r-- | src/libsystemd-bus/test-bus-match.c | 2 |
2 files changed, 30 insertions, 14 deletions
diff --git a/src/libsystemd-bus/bus-match.c b/src/libsystemd-bus/bus-match.c index 34488d8673..ffc97562fd 100644 --- a/src/libsystemd-bus/bus-match.c +++ b/src/libsystemd-bus/bus-match.c @@ -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 */ diff --git a/src/libsystemd-bus/test-bus-match.c b/src/libsystemd-bus/test-bus-match.c index 25d2b927ed..7227e2585d 100644 --- a/src/libsystemd-bus/test-bus-match.c +++ b/src/libsystemd-bus/test-bus-match.c @@ -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); |