pid namespace fixes for v4.12-rc2
Subsystems (4)
Linus,
Please pull the for-linus branch from the git tree:
git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace.git for-linus
HEAD: 3fd37226216620c1a468afa999739d5016fbc349 pid_ns: Fix race between setns'ed fork() and zap_pid_ns_processes()
These are two bugs that turn out to have simple fixes that were reported during the merge window. Both of these issues have existed for a while and it just happens that they both were reported at almost the same time.
Eric W. Biederman (1):
pid_ns: Sleep in TASK_INTERRUPTIBLE in zap_pid_ns_processes
Kirill Tkhai (1):
pid_ns: Fix race between setns'ed fork() and zap_pid_ns_processes()
kernel/fork.c | 8 ++++++-- kernel/pid_namespace.c | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-)
kernel/fork.c +6 -2
@@ -1845,11 +1845,13 @@ static __latent_entropy struct task_struct *copy_process(*/ recalc_sigpending ();if (signal_pending (current)) { -spin_unlock (¤t->sighand->siglock); -write_unlock_irq (&tasklist_lock); retval = -ERESTARTNOINTR ; goto bad_fork_cancel_cgroup; } +if (unlikely (!(ns_of_pid (pid)->nr_hashed &PIDNS_HASH_ADDING ))) { + retval = -ENOMEM ; + goto bad_fork_cancel_cgroup; + }if (likely (p->pid)) {ptrace_init_task (p, (clone_flags &CLONE_PTRACE ) || trace);
@@ -1907,6 +1909,8 @@ static __latent_entropy struct task_struct *copy_process(return p; bad_fork_cancel_cgroup: +spin_unlock (¤t->sighand->siglock); +write_unlock_irq (&tasklist_lock);cgroup_cancel_fork (p); bad_fork_free_pid:cgroup_threadgroup_change_end (current);
kernel/pid_namespace.c +1 -1
@@ -277,7 +277,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)* if reparented. */ for (;;) { -set_current_state (TASK_UNINTERRUPTIBLE ); +set_current_state (TASK_INTERRUPTIBLE );if (pid_ns->nr_hashed == init_pids)break ;schedule ();
Eric