]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
nspawn: Make sure we create bind mount points as the correct UID/GID 26249/head
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Sat, 28 Jan 2023 14:12:08 +0000 (15:12 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Sun, 29 Jan 2023 07:59:19 +0000 (08:59 +0100)
When using --private-users, we have to create bind mount points as
the user that will become root in the user namespace, so let's take
that into account.

src/nspawn/nspawn-mount.c

index 9de20126f4a2c858ef5d8b61633bb7e7e187e4f0..ee00362b546e1c4abdf0fafce41c2e6109e8040b 100644 (file)
@@ -794,7 +794,7 @@ static int mount_bind(const char *dest, CustomMount *m, uid_t uid_shift, uid_t u
                                                m->source, where);
 
         } else { /* Path doesn't exist yet? */
-                r = mkdir_parents_label(where, 0755);
+                r = mkdir_parents_safe_label(dest, where, 0755, uid_shift, uid_shift, MKDIR_IGNORE_EXISTING);
                 if (r < 0)
                         return log_error_errno(r, "Failed to make parents of %s: %m", where);
 
@@ -808,6 +808,9 @@ static int mount_bind(const char *dest, CustomMount *m, uid_t uid_shift, uid_t u
                         r = touch(where);
                 if (r < 0)
                         return log_error_errno(r, "Failed to create mount point %s: %m", where);
+
+                if (chown(where, uid_shift, uid_shift) < 0)
+                        return log_error_errno(errno, "Failed to chown %s: %m", where);
         }
 
         r = mount_nofollow_verbose(LOG_ERR, m->source, where, NULL, mount_flags, mount_opts);