From 771269ccdc267123882d011383447367fe81f70b Mon Sep 17 00:00:00 2001 From: Serge Hallyn Date: Mon, 2 Oct 2006 02:18:18 -0700 Subject: [PATCH] --- yaml --- r: 37834 b: refs/heads/master c: c0b2fc316599d6cd875b6b8cafa67f03b9512b4d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/fork.c | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 40d99e7c4beb..15497d4eab06 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 071df104f808b8195c40643dcb4d060681742e29 +refs/heads/master: c0b2fc316599d6cd875b6b8cafa67f03b9512b4d diff --git a/trunk/kernel/fork.c b/trunk/kernel/fork.c index c08cf05dd59b..208dd99f13bc 100644 --- a/trunk/kernel/fork.c +++ b/trunk/kernel/fork.c @@ -1606,7 +1606,7 @@ asmlinkage long sys_unshare(unsigned long unshare_flags) struct mm_struct *mm, *new_mm = NULL, *active_mm = NULL; struct files_struct *fd, *new_fd = NULL; struct sem_undo_list *new_ulist = NULL; - struct nsproxy *new_nsproxy, *old_nsproxy; + struct nsproxy *new_nsproxy = NULL, *old_nsproxy = NULL; struct uts_namespace *uts, *new_uts = NULL; check_unshare_flags(&unshare_flags); @@ -1634,18 +1634,24 @@ asmlinkage long sys_unshare(unsigned long unshare_flags) if ((err = unshare_utsname(unshare_flags, &new_uts))) goto bad_unshare_cleanup_semundo; - if (new_fs || new_ns || new_sigh || new_mm || new_fd || new_ulist || - new_uts) { - + if (new_ns || new_uts) { old_nsproxy = current->nsproxy; new_nsproxy = dup_namespaces(old_nsproxy); if (!new_nsproxy) { err = -ENOMEM; goto bad_unshare_cleanup_uts; } + } + + if (new_fs || new_ns || new_sigh || new_mm || new_fd || new_ulist || + new_uts) { task_lock(current); - current->nsproxy = new_nsproxy; + + if (new_nsproxy) { + current->nsproxy = new_nsproxy; + new_nsproxy = old_nsproxy; + } if (new_fs) { fs = current->fs; @@ -1687,9 +1693,11 @@ asmlinkage long sys_unshare(unsigned long unshare_flags) } task_unlock(current); - put_nsproxy(old_nsproxy); } + if (new_nsproxy) + put_nsproxy(new_nsproxy); + bad_unshare_cleanup_uts: if (new_uts) put_uts_ns(new_uts);