diff options
Diffstat (limited to 'kernel/user.c')
-rw-r--r-- | kernel/user.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/kernel/user.c b/kernel/user.c index 7e72614b736d..9e03e9c1df8d 100644 --- a/kernel/user.c +++ b/kernel/user.c | |||
@@ -17,9 +17,13 @@ | |||
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/user_namespace.h> | 18 | #include <linux/user_namespace.h> |
19 | 19 | ||
20 | /* | ||
21 | * userns count is 1 for root user, 1 for init_uts_ns, | ||
22 | * and 1 for... ? | ||
23 | */ | ||
20 | struct user_namespace init_user_ns = { | 24 | struct user_namespace init_user_ns = { |
21 | .kref = { | 25 | .kref = { |
22 | .refcount = ATOMIC_INIT(2), | 26 | .refcount = ATOMIC_INIT(3), |
23 | }, | 27 | }, |
24 | .creator = &root_user, | 28 | .creator = &root_user, |
25 | }; | 29 | }; |
@@ -47,7 +51,7 @@ static struct kmem_cache *uid_cachep; | |||
47 | */ | 51 | */ |
48 | static DEFINE_SPINLOCK(uidhash_lock); | 52 | static DEFINE_SPINLOCK(uidhash_lock); |
49 | 53 | ||
50 | /* root_user.__count is 2, 1 for init task cred, 1 for init_user_ns->creator */ | 54 | /* root_user.__count is 2, 1 for init task cred, 1 for init_user_ns->user_ns */ |
51 | struct user_struct root_user = { | 55 | struct user_struct root_user = { |
52 | .__count = ATOMIC_INIT(2), | 56 | .__count = ATOMIC_INIT(2), |
53 | .processes = ATOMIC_INIT(1), | 57 | .processes = ATOMIC_INIT(1), |
@@ -91,6 +95,7 @@ static struct user_struct *uid_hash_find(uid_t uid, struct hlist_head *hashent) | |||
91 | * upon function exit. | 95 | * upon function exit. |
92 | */ | 96 | */ |
93 | static void free_user(struct user_struct *up, unsigned long flags) | 97 | static void free_user(struct user_struct *up, unsigned long flags) |
98 | __releases(&uidhash_lock) | ||
94 | { | 99 | { |
95 | uid_hash_remove(up); | 100 | uid_hash_remove(up); |
96 | spin_unlock_irqrestore(&uidhash_lock, flags); | 101 | spin_unlock_irqrestore(&uidhash_lock, flags); |
@@ -157,6 +162,7 @@ struct user_struct *alloc_uid(struct user_namespace *ns, uid_t uid) | |||
157 | spin_lock_irq(&uidhash_lock); | 162 | spin_lock_irq(&uidhash_lock); |
158 | up = uid_hash_find(uid, hashent); | 163 | up = uid_hash_find(uid, hashent); |
159 | if (up) { | 164 | if (up) { |
165 | put_user_ns(ns); | ||
160 | key_put(new->uid_keyring); | 166 | key_put(new->uid_keyring); |
161 | key_put(new->session_keyring); | 167 | key_put(new->session_keyring); |
162 | kmem_cache_free(uid_cachep, new); | 168 | kmem_cache_free(uid_cachep, new); |