- introduce-get_task_pid-to-fix-unsafe-get_pid.patch removed from -mm tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch titled

     introduce get_task_pid() to fix unsafe get_pid()

has been removed from the -mm tree.  Its filename is

     introduce-get_task_pid-to-fix-unsafe-get_pid.patch

This patch was dropped because it was merged into mainline or a subsystem tree

------------------------------------------------------
Subject: introduce get_task_pid() to fix unsafe get_pid()
From: Oleg Nesterov <oleg@xxxxxxxxxx>

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 <oleg@xxxxxxxxxx>
Cc: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

 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;
_

Patches currently in -mm which might be from oleg@xxxxxxxxxx are

origin.patch
rcu-simplify-improve-batch-tuning.patch
pidhash-temporary-debug-checks.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux