summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2009-12-09 22:08:35 +0100
committerThomas Gleixner <tglx@linutronix.de>2010-02-21 20:20:08 +0100
commit8f4200b312eb06ab405d2c6d0075ce4bebf738dd (patch)
tree9f9a43782c06f4a8ddad0b83ca47a7b0bf5f9245
parent59b446882dbd906785be95cfcc8d8caef1dba08c (diff)
downloadlwn-8f4200b312eb06ab405d2c6d0075ce4bebf738dd.tar.gz
lwn-8f4200b312eb06ab405d2c6d0075ce4bebf738dd.zip
fs: Add missing rcu protection for __task_cred() in sys_ioprio_get
sys_ioprio_get() accesses __task_cred() without being in a RCU read side critical section. tasklist_lock is not protecting that when CONFIG_TREE_PREEMPT_RCU=y. Add a rcu_read_lock/unlock() section around the code which accesses __task_cred(). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: David Howells <dhowells@redhat.com> Cc: James Morris <jmorris@namei.org> Cc: linux-security-module@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org Cc: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/ioprio.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/ioprio.c b/fs/ioprio.c
index c7c0b28d7d21..82c40a23afd7 100644
--- a/fs/ioprio.c
+++ b/fs/ioprio.c
@@ -230,6 +230,7 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who)
if (!user)
break;
+ rcu_read_lock();
do_each_thread(g, p) {
if (__task_cred(p)->uid != user->uid)
continue;
@@ -241,6 +242,7 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who)
else
ret = ioprio_best(ret, tmpio);
} while_each_thread(g, p);
+ rcu_read_unlock();
if (who)
free_uid(user);