summaryrefslogtreecommitdiff
path: root/kernel/signal.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2009-12-10 00:53:21 +0000
committerThomas Gleixner <tglx@linutronix.de>2009-12-10 23:04:11 +0100
commit7cf7db8df0b78076eafa4ead47559344ca7b7a43 (patch)
tree5e536389e23d6c00fc93e51a4e4b90cfeac3fbc6 /kernel/signal.c
parent14d8c9f3c09e7fd7b9af80904289fe204f5b93c6 (diff)
downloadlwn-7cf7db8df0b78076eafa4ead47559344ca7b7a43.tar.gz
lwn-7cf7db8df0b78076eafa4ead47559344ca7b7a43.zip
signals: Fix more rcu assumptions
1) Remove the misleading comment in __sigqueue_alloc() which claims that holding a spinlock is equivalent to rcu_read_lock(). 2) Add a rcu_read_lock/unlock around the __task_cred() access in __sigqueue_alloc() This needs to be revisited to remove the remaining users of read_lock(&tasklist_lock) but that's outside the scope of this patch. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> LKML-Reference: <20091210004703.269843657@linutronix.de>
Diffstat (limited to 'kernel/signal.c')
-rw-r--r--kernel/signal.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index 73316568a69c..f67545f9394c 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -218,13 +218,13 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi
struct user_struct *user;
/*
- * We won't get problems with the target's UID changing under us
- * because changing it requires RCU be used, and if t != current, the
- * caller must be holding the RCU readlock (by way of a spinlock) and
- * we use RCU protection here
+ * Protect access to @t credentials. This can go away when all
+ * callers hold rcu read lock.
*/
+ rcu_read_lock();
user = get_uid(__task_cred(t)->user);
atomic_inc(&user->sigpending);
+ rcu_read_unlock();
if (override_rlimit ||
atomic_read(&user->sigpending) <=