]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
execute: remove credentials dir again when empty 27525/head
authorLennart Poettering <lennart@poettering.net>
Thu, 4 May 2023 10:06:10 +0000 (12:06 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 4 May 2023 10:10:06 +0000 (12:10 +0200)
This is closely related to the previous commit: if the credentials dir
is empty and nothing mounted on it, let's remove it again.

This will in particular happen if we decided to not actually install the
mount we prepared for the credentials because it is empty. In that case
the mount point inode is already there, and with this we'll remove it.
Primary effect, users will see ENOENT rather than EACCESS when trying to
access it, which should be preferable, given we already handle that
nicely in our credential consumption code.

This should also be useful on systems where we lack any privs to create
mounts, and thus operate on a regular dir anyway.

src/core/execute.c
src/core/namespace.c

index b803edb1450b2cbc58297684835b83253e3fc88e..04dcf4b42746966f212ae08501a124bd8591ac56 100644 (file)
@@ -3423,6 +3423,11 @@ static int setup_credentials(
                 _exit(EXIT_FAILURE);
         }
 
+        /* If the credentials dir is empty and not a mount point, then there's no point in having it. Let's
+         * try to remove it. This matters in particular if we created the dir as mount point but then didn't
+         * actually end up mounting anything on it. In that case we'd rather have ENOENT than EACCESS being
+         * seen by users when trying access this inode. */
+        (void) rmdir(p);
         return 0;
 }
 
index 1d19685d2eaeb154576da13c5847e9054cce8a2e..2fcc096217d8fbbbb9f6ff32ebbc71703fbfebfc 100644 (file)
@@ -2385,6 +2385,7 @@ int setup_namespace(
                                 .mode = BIND_MOUNT,
                                 .read_only = true,
                                 .source_const = creds_path,
+                                .ignore = true,
                         };
                 } else {
                         /* If our service has no credentials store configured, then make the whole