From 09d4256f71c7c12c4f2da319abc3c3dbda2a8072 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 4 Nov 2006 13:03:00 -0800 Subject: [PATCH] --- yaml --- r: 40696 b: refs/heads/master c: 10b1fbdb0a0ca91847a534ad26d0bc250c25b74f h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/signal.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index b35e13bcf7d2..64bdf2c9e42d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 45c18b0bb579b5c1b89f8c99f1b6ffa4c586ba08 +refs/heads/master: 10b1fbdb0a0ca91847a534ad26d0bc250c25b74f diff --git a/trunk/kernel/signal.c b/trunk/kernel/signal.c index 7ed8d5304bec..df18c167a2a7 100644 --- a/trunk/kernel/signal.c +++ b/trunk/kernel/signal.c @@ -267,18 +267,25 @@ static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags, int override_rlimit) { struct sigqueue *q = NULL; + struct user_struct *user; - atomic_inc(&t->user->sigpending); + /* + * In order to avoid problems with "switch_user()", we want to make + * sure that the compiler doesn't re-load "t->user" + */ + user = t->user; + barrier(); + atomic_inc(&user->sigpending); if (override_rlimit || - atomic_read(&t->user->sigpending) <= + atomic_read(&user->sigpending) <= t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur) q = kmem_cache_alloc(sigqueue_cachep, flags); if (unlikely(q == NULL)) { - atomic_dec(&t->user->sigpending); + atomic_dec(&user->sigpending); } else { INIT_LIST_HEAD(&q->list); q->flags = 0; - q->user = get_uid(t->user); + q->user = get_uid(user); } return(q); }