From 068733044f4941bf862811b0224d64104ee776e6 Mon Sep 17 00:00:00 2001 From: "Eric W. Biederman" Date: Fri, 27 Jul 2012 06:21:27 -0700 Subject: [PATCH] --- yaml --- r: 346324 b: refs/heads/master c: 37657da3c5d4a3bbbbb9d3b78f53a8134a0abae0 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/user_namespace.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 339adc7825bc..4d9df272e3e0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7fa294c8991ce0ed4e713f08209eb2ce3e1044ac +refs/heads/master: 37657da3c5d4a3bbbbb9d3b78f53a8134a0abae0 diff --git a/trunk/kernel/user_namespace.c b/trunk/kernel/user_namespace.c index 456a6b9fba34..49096d559e08 100644 --- a/trunk/kernel/user_namespace.c +++ b/trunk/kernel/user_namespace.c @@ -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;