diff options
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 84989124bafb..2a64304ed54b 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -180,7 +180,7 @@ int next_signal(struct sigpending *pending, sigset_t *mask) | |||
180 | /* | 180 | /* |
181 | * allocate a new signal queue record | 181 | * allocate a new signal queue record |
182 | * - this may be called without locks if and only if t == current, otherwise an | 182 | * - this may be called without locks if and only if t == current, otherwise an |
183 | * appopriate lock must be held to protect t's user_struct | 183 | * appopriate lock must be held to stop the target task from exiting |
184 | */ | 184 | */ |
185 | static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags, | 185 | static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags, |
186 | int override_rlimit) | 186 | int override_rlimit) |
@@ -194,7 +194,7 @@ static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags, | |||
194 | * caller must be holding the RCU readlock (by way of a spinlock) and | 194 | * caller must be holding the RCU readlock (by way of a spinlock) and |
195 | * we use RCU protection here | 195 | * we use RCU protection here |
196 | */ | 196 | */ |
197 | user = __task_cred(t)->user; | 197 | user = get_uid(__task_cred(t)->user); |
198 | atomic_inc(&user->sigpending); | 198 | atomic_inc(&user->sigpending); |
199 | if (override_rlimit || | 199 | if (override_rlimit || |
200 | atomic_read(&user->sigpending) <= | 200 | atomic_read(&user->sigpending) <= |
@@ -202,12 +202,14 @@ static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags, | |||
202 | q = kmem_cache_alloc(sigqueue_cachep, flags); | 202 | q = kmem_cache_alloc(sigqueue_cachep, flags); |
203 | if (unlikely(q == NULL)) { | 203 | if (unlikely(q == NULL)) { |
204 | atomic_dec(&user->sigpending); | 204 | atomic_dec(&user->sigpending); |
205 | free_uid(user); | ||
205 | } else { | 206 | } else { |
206 | INIT_LIST_HEAD(&q->list); | 207 | INIT_LIST_HEAD(&q->list); |
207 | q->flags = 0; | 208 | q->flags = 0; |
208 | q->user = get_uid(user); | 209 | q->user = user; |
209 | } | 210 | } |
210 | return(q); | 211 | |
212 | return q; | ||
211 | } | 213 | } |
212 | 214 | ||
213 | static void __sigqueue_free(struct sigqueue *q) | 215 | static void __sigqueue_free(struct sigqueue *q) |