]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
nspawn: don't require chown() if userns is not on 4693/head
authorLennart Poettering <lennart@poettering.net>
Tue, 22 Nov 2016 12:35:24 +0000 (13:35 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 22 Nov 2016 12:35:24 +0000 (13:35 +0100)
Fixes: #4711
src/nspawn/nspawn-mount.c

index 95bb3c09b0acd0ce5095785163a8790ba90c492e..91cb0861d334fed841a3ea0df849e0b66f87182f 100644 (file)
@@ -298,7 +298,7 @@ int mount_sysfs(const char *dest, MountSettingsMask mount_settings) {
                              MS_BIND|MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_REMOUNT|extra_flags, NULL);
 }
 
-static int mkdir_userns(const char *path, mode_t mode, bool in_userns, uid_t uid_shift) {
+static int mkdir_userns(const char *path, mode_t mode, MountSettingsMask mask, uid_t uid_shift) {
         int r;
 
         assert(path);
@@ -307,16 +307,20 @@ static int mkdir_userns(const char *path, mode_t mode, bool in_userns, uid_t uid
         if (r < 0 && errno != EEXIST)
                 return -errno;
 
-        if (!in_userns) {
-                r = lchown(path, uid_shift, uid_shift);
-                if (r < 0)
-                        return -errno;
-        }
+        if ((mask & MOUNT_USE_USERNS) == 0)
+                return 0;
+
+        if (mask & MOUNT_IN_USERNS)
+                return 0;
+
+        r = lchown(path, uid_shift, uid_shift);
+        if (r < 0)
+                return -errno;
 
         return 0;
 }
 
-static int mkdir_userns_p(const char *prefix, const char *path, mode_t mode, bool in_userns, uid_t uid_shift) {
+static int mkdir_userns_p(const char *prefix, const char *path, mode_t mode, MountSettingsMask mask, uid_t uid_shift) {
         const char *p, *e;
         int r;
 
@@ -343,12 +347,12 @@ static int mkdir_userns_p(const char *prefix, const char *path, mode_t mode, boo
                 if (prefix && path_startswith(prefix, t))
                         continue;
 
-                r = mkdir_userns(t, mode, in_userns, uid_shift);
+                r = mkdir_userns(t, mode, mask, uid_shift);
                 if (r < 0)
                         return r;
         }
 
-        return mkdir_userns(path, mode, in_userns, uid_shift);
+        return mkdir_userns(path, mode, mask, uid_shift);
 }
 
 int mount_all(const char *dest,
@@ -422,7 +426,7 @@ int mount_all(const char *dest,
                 if (mount_table[k].what && r > 0)
                         continue;
 
-                r = mkdir_userns_p(dest, where, 0755, in_userns, uid_shift);
+                r = mkdir_userns_p(dest, where, 0755, mount_settings, uid_shift);
                 if (r < 0 && r != -EEXIST) {
                         if (fatal)
                                 return log_error_errno(r, "Failed to create directory %s: %m", where);