From 578dc69f2a60d6282acc2d06ce8a3bf8a9d8ada0 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 6 Mar 2020 15:56:28 +0900 Subject: [PATCH 1/2] execute: Fix migration from DynamicUser=yes to no Closes #12131. --- src/core/execute.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/core/execute.c b/src/core/execute.c index 4595bb12dce..46b5c99ada1 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -2247,7 +2247,7 @@ static int setup_exec_directory( if (type != EXEC_DIRECTORY_CONFIGURATION && readlink_and_make_absolute(p, &target) >= 0) { - _cleanup_free_ char *q = NULL; + _cleanup_free_ char *q = NULL, *q_resolved = NULL, *target_resolved = NULL; /* This already exists and is a symlink? Interesting. Maybe it's one created * by DynamicUser=1 (see above)? @@ -2256,13 +2256,22 @@ static int setup_exec_directory( * since they all support the private/ symlink logic at least in some * configurations, see above. */ + r = chase_symlinks(target, NULL, 0, &target_resolved, NULL); + if (r < 0) + goto fail; + q = path_join(params->prefix[type], "private", *rt); if (!q) { r = -ENOMEM; goto fail; } - if (path_equal(q, target)) { + /* /var/lib or friends may be symlinks. So, let's chase them also. */ + r = chase_symlinks(q, NULL, CHASE_NONEXISTENT, &q_resolved, NULL); + if (r < 0) + goto fail; + + if (path_equal(q_resolved, target_resolved)) { /* Hmm, apparently DynamicUser= was once turned on for this service, * but is no longer. Let's move the directory back up. */ From abaaa79b22f48dac0b45737fcef730fc3471384c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 6 Mar 2020 17:34:55 +0900 Subject: [PATCH 2/2] test: add a test case for migrating DynamicUser=yes to no --- src/test/test-execute.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/test-execute.c b/src/test/test-execute.c index 92a0516df76..4e0fd7d5b4b 100644 --- a/src/test/test-execute.c +++ b/src/test/test-execute.c @@ -561,6 +561,7 @@ static void test_exec_dynamicuser(Manager *m) { test(__func__, m, "exec-dynamicuser-statedir-migrate-step1.service", 0, CLD_EXITED); test(__func__, m, "exec-dynamicuser-statedir-migrate-step2.service", can_unshare ? 0 : EXIT_NAMESPACE, CLD_EXITED); + test(__func__, m, "exec-dynamicuser-statedir-migrate-step1.service", 0, CLD_EXITED); (void) rm_rf("/var/lib/test-dynamicuser-migrate", REMOVE_ROOT|REMOVE_PHYSICAL); (void) rm_rf("/var/lib/test-dynamicuser-migrate2", REMOVE_ROOT|REMOVE_PHYSICAL);