summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorHillf Danton <dhillf@gmail.com>2010-12-29 21:55:28 +0800
committerAK <andi@firstfloor.org>2011-02-06 11:03:48 -0800
commit55eb2febc4ec26d4ecde0964af63e4f152d353bf (patch)
tree95469d20c2dced71e16d574df03b6d2e41b89c5c /kernel
parent01dda54376c56e99e475193d6c112f05476e5280 (diff)
fix freeing user_struct in user cache
commit 4ef9e11d6867f88951e30db910fa015300e31871 upstream. When racing on adding into user cache, the new allocated from mm slab is freed without putting user namespace. Since the user namespace is already operated by getting, putting has to be issued. Signed-off-by: Hillf Danton <dhillf@gmail.com> Acked-by: Serge Hallyn <serge@hallyn.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> Signed-off-by: Andi Kleen <ak@linux.intel.com>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/user.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/kernel/user.c b/kernel/user.c
index 7e72614b736d..8ce395f74d47 100644
--- a/kernel/user.c
+++ b/kernel/user.c
@@ -157,6 +157,7 @@ struct user_struct *alloc_uid(struct user_namespace *ns, uid_t uid)
spin_lock_irq(&uidhash_lock);
up = uid_hash_find(uid, hashent);
if (up) {
+ put_user_ns(ns);
key_put(new->uid_keyring);
key_put(new->session_keyring);
kmem_cache_free(uid_cachep, new);