userns: Allow setting a userns mapping to your current uid.
authorEric W. Biederman <ebiederm@xmission.com>
Fri, 27 Jul 2012 13:21:27 +0000 (06:21 -0700)
committerEric W. Biederman <ebiederm@xmission.com>
Tue, 20 Nov 2012 12:17:40 +0000 (04:17 -0800)
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
kernel/user_namespace.c

index 456a6b9fba34f3104bc9db64119acd9d3fdfa8df..49096d559e08755e14f6f88f3dfffdfa81caccaa 100644 (file)
@@ -709,6 +709,21 @@ ssize_t proc_projid_map_write(struct file *file, const char __user *buf, size_t
 static bool new_idmap_permitted(struct user_namespace *ns, int cap_setid,
                                struct uid_gid_map *new_map)
 {
+       /* Allow mapping to your own filesystem ids */
+       if ((new_map->nr_extents == 1) && (new_map->extent[0].count == 1)) {
+               u32 id = new_map->extent[0].lower_first;
+               if (cap_setid == CAP_SETUID) {
+                       kuid_t uid = make_kuid(ns->parent, id);
+                       if (uid_eq(uid, current_fsuid()))
+                               return true;
+               }
+               else if (cap_setid == CAP_SETGID) {
+                       kgid_t gid = make_kgid(ns->parent, id);
+                       if (gid_eq(gid, current_fsgid()))
+                               return true;
+               }
+       }
+
        /* Allow anyone to set a mapping that doesn't require privilege */
        if (!cap_valid(cap_setid))
                return true;