]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
execute: Fix migration from DynamicUser=yes to no
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 6 Mar 2020 06:56:28 +0000 (15:56 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 6 Mar 2020 12:02:26 +0000 (21:02 +0900)
Closes #12131.

src/core/execute.c

index 4595bb12dce7d7419c356795189f1406ac6470dd..46b5c99ada1c5cb09314a052193b3d18148f2fb7 100644 (file)
@@ -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. */