From 320814811417146cfa1e416f69f1101eed630c36 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 3 Feb 2015 20:07:37 -0500 Subject: [PATCH] cg_path_get_user_unit(): Did not correctly parse user-unit templates. It ran either skip_session() or skip_user_manager(), then ran skip_slices() iff skip_session() ran. It needs to run skip_slices() in either case. Included is a test case demonstrating why. --- src/shared/cgroup-util.c | 18 ++++++++---------- src/test/test-cgroup-util.c | 1 + 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c index b527868e6..dfd8689b7 100644 --- a/src/shared/cgroup-util.c +++ b/src/shared/cgroup-util.c @@ -1251,17 +1251,15 @@ int cg_path_get_user_unit(const char *path, char **unit) { /* Skip slices, if there are any */ e = skip_slices(path); - /* Skip the session scope... */ + /* Skip the session scope or user manager... */ t = skip_session(e); - if (t) - /* ... and skip more slices if there's one */ - e = skip_slices(t); - else { - /* ... or require a user manager unit to be there */ - e = skip_user_manager(e); - if (!e) - return -ENOENT; - } + if (!t) + t = skip_user_manager(e); + if (!t) + return -ENOENT; + + /* ... and skip more slices if there are any */ + e = skip_slices(t); return cg_path_decode_unit(e, unit); } diff --git a/src/test/test-cgroup-util.c b/src/test/test-cgroup-util.c index 58eb74427..67eeeb56b 100644 --- a/src/test/test-cgroup-util.c +++ b/src/test/test-cgroup-util.c @@ -93,6 +93,7 @@ static void test_path_get_user_unit(void) { check_p_g_u_u("/meh.service", -ENOENT, NULL); check_p_g_u_u("/session-3.scope/_cpu.service", 0, "cpu.service"); check_p_g_u_u("/user.slice/user-1000.slice/user@1000.service/server.service", 0, "server.service"); + check_p_g_u_u("/user.slice/user-1000.slice/user@1000.service/foobar.slice/foobar@pie.service", 0, "foobar@pie.service"); check_p_g_u_u("/user.slice/user-1000.slice/user@.service/server.service", -ENOENT, NULL); } -- 2.30.2