summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-05-03 19:02:24 +0200
committerLennart Poettering <lennart@poettering.net>2013-05-03 19:06:06 +0200
commita0ab566574303be1ca12cdb334f284cfd407caa5 (patch)
tree3d3d2abf68e2d8472a3511971021715dfc294f90
parent4641a16b15a0e50b61259316b3fda43e0b48f7d5 (diff)
downloadsystemd-a0ab566574303be1ca12cdb334f284cfd407caa5.tar.gz
cgroup: when escaping a cgroup object name, also escape names that start with a dot
-rw-r--r--src/shared/cgroup-util.c7
-rw-r--r--src/test/test-cgroup-util.c4
2 files changed, 10 insertions, 1 deletions
diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c
index c5a5f8df83..43c415d760 100644
--- a/src/shared/cgroup-util.c
+++ b/src/shared/cgroup-util.c
@@ -1527,7 +1527,12 @@ char *cg_escape(const char *p) {
/* The return value of this function (unlike cg_unescape())
* needs free()! */
- if (p[0] == '_' || streq(p, "notify_on_release") || streq(p, "release_agent") || streq(p, "tasks"))
+ if (p[0] == 0 ||
+ p[0] == '_' ||
+ p[0] == '.' ||
+ streq(p, "notify_on_release") ||
+ streq(p, "release_agent") ||
+ streq(p, "tasks"))
need_prefix = true;
else {
const char *dot;
diff --git a/src/test/test-cgroup-util.c b/src/test/test-cgroup-util.c
index cc1a6fd723..c9634d42b0 100644
--- a/src/test/test-cgroup-util.c
+++ b/src/test/test-cgroup-util.c
@@ -146,11 +146,15 @@ static void test_escape_one(const char *s, const char *r) {
static void test_escape(void) {
test_escape_one("foobar", "foobar");
+ test_escape_one(".foobar", "_.foobar");
test_escape_one("foobar.service", "foobar.service");
test_escape_one("cgroup.service", "_cgroup.service");
test_escape_one("cpu.service", "_cpu.service");
test_escape_one("tasks", "_tasks");
test_escape_one("_foobar", "__foobar");
+ test_escape_one("", "_");
+ test_escape_one("_", "__");
+ test_escape_one(".", "_.");
}
static void test_controller_is_valid(void) {