aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@redhat.com>2009-04-02 19:58:35 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-04-02 22:05:02 -0400
commit6dda81f4384b94930826eded254d8c16f89a9248 (patch)
treea7b27ca16a6feba637cb01e68b54c58b6ca07bc2 /include/linux
parent8e654fba4a376f436bdfe361fc5cdbc87ac09b35 (diff)
pids: document task_pgrp/task_session is not safe without tasklist/rcu
Even if task == current, it is not safe to dereference the result of task_pgrp/task_session. We can race with another thread which changes the special pid via setpgid/setsid. Document this. The next 2 patches give an example of the unsafe usage, we have more bad users. [akpm@linux-foundation.org: coding-style fixes] Signed-off-by: Oleg Nesterov <oleg@redhat.com> Cc: Louis Rilling <Louis.Rilling@kerlabs.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Pavel Emelyanov <xemul@openvz.org> Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Cc: Roland McGrath <roland@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/sched.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h
index b47c94e7560b..722dd313bf8a 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1489,6 +1489,11 @@ static inline struct pid *task_tgid(struct task_struct *task)
1489 return task->group_leader->pids[PIDTYPE_PID].pid; 1489 return task->group_leader->pids[PIDTYPE_PID].pid;
1490} 1490}
1491 1491
1492/*
1493 * Without tasklist or rcu lock it is not safe to dereference
1494 * the result of task_pgrp/task_session even if task == current,
1495 * we can race with another thread doing sys_setsid/sys_setpgid.
1496 */
1492static inline struct pid *task_pgrp(struct task_struct *task) 1497static inline struct pid *task_pgrp(struct task_struct *task)
1493{ 1498{
1494 return task->group_leader->pids[PIDTYPE_PGID].pid; 1499 return task->group_leader->pids[PIDTYPE_PGID].pid;