From: Oleg Nesterov proc_pid_make_inode: ei->pid = get_pid(task_pid(task)); I think this is not safe. get_pid() can be preempted after checking "pid != NULL". Then the task exits, does detach_pid(), and RCU frees the pid. Signed-off-by: Oleg Nesterov Cc: "Eric W. Biederman" Signed-off-by: Andrew Morton --- fs/proc/base.c | 4 ++-- include/linux/pid.h | 2 ++ kernel/pid.c | 9 +++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff -puN fs/proc/base.c~introduce-get_task_pid-to-fix-unsafe-get_pid fs/proc/base.c --- a/fs/proc/base.c~introduce-get_task_pid-to-fix-unsafe-get_pid +++ a/fs/proc/base.c @@ -958,7 +958,7 @@ static struct inode *proc_pid_make_inode /* * grab the reference to task. */ - ei->pid = get_pid(task_pid(task)); + ei->pid = get_task_pid(task, PIDTYPE_PID); if (!ei->pid) goto out_unlock; @@ -1677,7 +1677,7 @@ static struct dentry *proc_base_instanti /* * grab the reference to the task. */ - ei->pid = get_pid(task_pid(task)); + ei->pid = get_task_pid(task, PIDTYPE_PID); if (!ei->pid) goto out_iput; diff -puN include/linux/pid.h~introduce-get_task_pid-to-fix-unsafe-get_pid include/linux/pid.h --- a/include/linux/pid.h~introduce-get_task_pid-to-fix-unsafe-get_pid +++ a/include/linux/pid.h @@ -68,6 +68,8 @@ extern struct task_struct *FASTCALL(pid_ extern struct task_struct *FASTCALL(get_pid_task(struct pid *pid, enum pid_type)); +extern struct pid *get_task_pid(struct task_struct *task, enum pid_type type); + /* * attach_pid() and detach_pid() must be called with the tasklist_lock * write-held. diff -puN kernel/pid.c~introduce-get_task_pid-to-fix-unsafe-get_pid kernel/pid.c --- a/kernel/pid.c~introduce-get_task_pid-to-fix-unsafe-get_pid +++ a/kernel/pid.c @@ -304,6 +304,15 @@ struct task_struct *find_task_by_pid_typ EXPORT_SYMBOL(find_task_by_pid_type); +struct pid *get_task_pid(struct task_struct *task, enum pid_type type) +{ + struct pid *pid; + rcu_read_lock(); + pid = get_pid(task->pids[type].pid); + rcu_read_unlock(); + return pid; +} + struct task_struct *fastcall get_pid_task(struct pid *pid, enum pid_type type) { struct task_struct *result; _