[PATCH 4/6] pidns: Don't allow new pids after the namespace is dead.

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Eric W. Biederman
Date: Sunday, June 20, 2010 - 1:47 am

In the case of unsharing or joining a pid namespace, it becomes
possible to attempt to allocate a pid after zap_pid_namespace has
killed everything in the namespace.  Close the hole for now by simply
not allowing any of those pid allocations to succeed.  At least for
now it is too strange to think about.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
---
 include/linux/pid_namespace.h |    1 +
 kernel/pid.c                  |    4 ++++
 kernel/pid_namespace.c        |    2 ++
 3 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h
index 38d1032..b447d37 100644
--- a/include/linux/pid_namespace.h
+++ b/include/linux/pid_namespace.h
@@ -20,6 +20,7 @@ struct pid_namespace {
 	struct kref kref;
 	struct pidmap pidmap[PIDMAP_ENTRIES];
 	int last_pid;
+	atomic_t dead;
 	struct task_struct *child_reaper;
 	struct kmem_cache *pid_cachep;
 	unsigned int level;
diff --git a/kernel/pid.c b/kernel/pid.c
index e9fd8c1..e1f26ec 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -248,6 +248,10 @@ struct pid *alloc_pid(struct pid_namespace *ns)
 	struct pid_namespace *tmp;
 	struct upid *upid;
 
+	pid = NULL;
+	if (atomic_read(&ns->dead))
+		goto out;
+
 	pid = kmem_cache_alloc(ns->pid_cachep, GFP_KERNEL);
 	if (!pid)
 		goto out;
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c
index b90e4ab..34a251d 100644
--- a/kernel/pid_namespace.c
+++ b/kernel/pid_namespace.c
@@ -90,6 +90,7 @@ static struct pid_namespace *create_pid_namespace(struct pid_namespace *parent_p
 	kref_init(&ns->kref);
 	ns->level = level;
 	ns->parent = get_pid_ns(parent_pid_ns);
+	atomic_set(&ns->dead, 0);
 
 	set_bit(0, ns->pidmap[0].page);
 	atomic_set(&ns->pidmap[0].nr_free, BITS_PER_PAGE - 1);
@@ -161,6 +162,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)
 	 *
 	 */
 	read_lock(&tasklist_lock);
+	atomic_set(&pid_ns->dead, 1);
 	nr = next_pidmap(pid_ns, 1);
 	while (nr > 0) {
 		rcu_read_lock();
-- 
1.6.5.2.143.g8cc62

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/4] pid_ns_prepare_proc/unshare cleanups, Oleg Nesterov, (Sat Jun 19, 12:08 pm)
[PATCH 2/4] procfs: kill the global proc_mnt variable, Oleg Nesterov, (Sat Jun 19, 12:10 pm)
[PATCH 0/6] Unshare support for the pid namespace., Eric W. Biederman, (Sun Jun 20, 1:42 am)
[PATCH 1/6] pid: Remove the child_reaper special case in ..., Eric W. Biederman, (Sun Jun 20, 1:44 am)
[PATCH 2/6] pidns: Call pid_ns_prepare_proc from create_pi ..., Eric W. Biederman, (Sun Jun 20, 1:45 am)
[PATCH 3/6] procfs: kill the global proc_mnt variable, Eric W. Biederman, (Sun Jun 20, 1:45 am)
[PATCH 4/6] pidns: Don't allow new pids after the namespac ..., Eric W. Biederman, (Sun Jun 20, 1:47 am)
[PATCH 5/6] pidns: Use task_active_pid_ns where appropriate, Eric W. Biederman, (Sun Jun 20, 1:48 am)
[PATCH 6/6] pidns: Support unsharing the pid namespace., Eric W. Biederman, (Sun Jun 20, 1:49 am)
Re: [PATCH 0/6] Unshare support for the pid namespace., Oleg Nesterov, (Sun Jun 20, 11:03 am)
[PATCH 0/2] pid_ns_release_proc() fixes, Oleg Nesterov, (Sun Jun 20, 11:05 am)
Re: [PATCH 0/6] Unshare support for the pid namespace., Eric W. Biederman, (Sun Jun 20, 2:00 pm)
Re: [PATCH 0/6] Unshare support for the pid namespace., Oleg Nesterov, (Sun Jun 20, 2:48 pm)
Re: [PATCH 0/6] Unshare support for the pid namespace., Oleg Nesterov, (Sun Jun 20, 2:56 pm)
Re: [PATCH 6/6] pidns: Support unsharing the pid namespace., Eric W. Biederman, (Sun Jun 20, 6:53 pm)
Re: [PATCH 1/1] pid_ns: move pid_ns_release_proc() from pr ..., Sukadev Bhattiprolu, (Wed Jun 23, 11:36 pm)
Re: [PATCH 1/1] pid_ns: move pid_ns_release_proc() from pr ..., Eric W. Biederman, (Thu Jun 24, 12:06 am)
Re: [RESEND PATCH] pid_ns: Fix proc_flush_task() accessing ..., Sukadev Bhattiprolu, (Fri Jun 25, 11:37 am)
Re: [RESEND PATCH] pid_ns: Fix proc_flush_task() accessing ..., Sukadev Bhattiprolu, (Fri Jun 25, 2:26 pm)
Re: [RESEND PATCH] pid_ns: Fix proc_flush_task() accessing ..., Sukadev Bhattiprolu, (Fri Jun 25, 3:07 pm)
[PATCH 01/24] pidns: Remove races by stopping the caching ..., Eric W. Biederman, (Fri Jul 9, 8:58 am)
Re: [PATCH 01/24] pidns: Remove races by stopping the cach ..., Eric W. Biederman, (Sun Jul 11, 7:25 am)
[PATCH] pidns: Fix wait for zombies to be reaped in zap_pi ..., Eric W. Biederman, (Mon Jul 12, 11:09 am)
Re: [PATCH] pidns: Fix wait for zombies to be reaped in za ..., Eric W. Biederman, (Tue Jul 13, 6:47 pm)
Re: [PATCH] pidns: Fix wait for zombies to be reaped in za ..., Sukadev Bhattiprolu, (Wed Jul 14, 1:53 pm)
Re: [PATCH] pidns: Fix wait for zombies to be reaped in za ..., Eric W. Biederman, (Wed Jul 14, 2:35 pm)
Re: [PATCH] pidns: Fix wait for zombies to be reaped in za ..., Sukadev Bhattiprolu, (Sat Oct 30, 12:07 am)