aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/fork.c
diff options
context:
space:
mode:
authorMike Galbraith <efault@gmx.de>2012-05-10 13:01:45 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-21 09:40:01 -0700
commit6f6f21eceec3a60d2066bb3b5e31dc14f9168fa7 (patch)
tree09887d55c1e9feddc5093ed021e1d6c39dbdbe6f /kernel/fork.c
parent5b05ac638c39e92f3fa6291b4aebd6fc485320ba (diff)
downloadkernel_samsung_smdk4412-6f6f21eceec3a60d2066bb3b5e31dc14f9168fa7.zip
kernel_samsung_smdk4412-6f6f21eceec3a60d2066bb3b5e31dc14f9168fa7.tar.gz
kernel_samsung_smdk4412-6f6f21eceec3a60d2066bb3b5e31dc14f9168fa7.tar.bz2
namespaces, pid_ns: fix leakage on fork() failure
commit 5e2bf0142231194d36fdc9596b36a261ed2b9fe7 upstream. Fork() failure post namespace creation for a child cloned with CLONE_NEWPID leaks pid_namespace/mnt_cache due to proc being mounted during creation, but not unmounted during cleanup. Call pid_ns_release_proc() during cleanup. Signed-off-by: Mike Galbraith <efault@gmx.de> Acked-by: Oleg Nesterov <oleg@redhat.com> Reviewed-by: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Pavel Emelyanov <xemul@parallels.com> Cc: Cyrill Gorcunov <gorcunov@openvz.org> Cc: Louis Rilling <louis.rilling@kerlabs.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'kernel/fork.c')
-rw-r--r--kernel/fork.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/kernel/fork.c b/kernel/fork.c
index a4e453b..4712e3e 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -48,6 +48,7 @@
#include <linux/audit.h>
#include <linux/memcontrol.h>
#include <linux/ftrace.h>
+#include <linux/proc_fs.h>
#include <linux/profile.h>
#include <linux/rmap.h>
#include <linux/ksm.h>
@@ -1378,6 +1379,8 @@ bad_fork_cleanup_io:
if (p->io_context)
exit_io_context(p);
bad_fork_cleanup_namespaces:
+ if (unlikely(clone_flags & CLONE_NEWPID))
+ pid_ns_release_proc(p->nsproxy->pid_ns);
exit_task_namespaces(p);
bad_fork_cleanup_mm:
if (p->mm) {