From 5c6d40d13238e56699074fc1b01f4ac929ba62b8 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 24 Jun 2019 16:18:49 +0200 Subject: [PATCH] core: migrate service directories back from private if needed Fixes: #12131 --- src/core/execute.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/core/execute.c b/src/core/execute.c index 2da978e406c..202e3b31a59 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -2171,6 +2171,38 @@ static int setup_exec_directory( goto fail; } else { + _cleanup_free_ char *target = NULL; + + if (type != EXEC_DIRECTORY_CONFIGURATION && + readlink_and_make_absolute(p, &target) >= 0) { + _cleanup_free_ char *q = NULL; + + /* This already exists and is a symlink? Interesting. Maybe it's one created + * by DynamicUser=1 (see above)? */ + + q = path_join(params->prefix[type], "private", *rt); + if (!q) { + r = -ENOMEM; + goto fail; + } + + if (path_equal(q, target)) { + + /* Hmm, apparently DynamicUser= was once turned on for this service, + * but is no longer. Let's move the directory back up. */ + + if (unlink(p) < 0) { + r = -errno; + goto fail; + } + + if (rename(q, p) < 0) { + r = -errno; + goto fail; + } + } + } + r = mkdir_label(p, context->directories[type].mode); if (r < 0) { if (r != -EEXIST)