diff options
-rw-r--r-- | kernel/user_namespace.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c index 9451b12a9b6c..1e34de2fbd60 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c | |||
@@ -812,14 +812,16 @@ static bool new_idmap_permitted(const struct file *file, | |||
812 | struct user_namespace *ns, int cap_setid, | 812 | struct user_namespace *ns, int cap_setid, |
813 | struct uid_gid_map *new_map) | 813 | struct uid_gid_map *new_map) |
814 | { | 814 | { |
815 | const struct cred *cred = file->f_cred; | ||
815 | /* Don't allow mappings that would allow anything that wouldn't | 816 | /* Don't allow mappings that would allow anything that wouldn't |
816 | * be allowed without the establishment of unprivileged mappings. | 817 | * be allowed without the establishment of unprivileged mappings. |
817 | */ | 818 | */ |
818 | if ((new_map->nr_extents == 1) && (new_map->extent[0].count == 1)) { | 819 | if ((new_map->nr_extents == 1) && (new_map->extent[0].count == 1) && |
820 | uid_eq(ns->owner, cred->euid)) { | ||
819 | u32 id = new_map->extent[0].lower_first; | 821 | u32 id = new_map->extent[0].lower_first; |
820 | if (cap_setid == CAP_SETUID) { | 822 | if (cap_setid == CAP_SETUID) { |
821 | kuid_t uid = make_kuid(ns->parent, id); | 823 | kuid_t uid = make_kuid(ns->parent, id); |
822 | if (uid_eq(uid, file->f_cred->euid)) | 824 | if (uid_eq(uid, cred->euid)) |
823 | return true; | 825 | return true; |
824 | } | 826 | } |
825 | } | 827 | } |