diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index c9e660ae47aa..33fcf0733ca6 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -1119,11 +1119,9 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1119 | goto bad_fork_cleanup_mm; | 1119 | goto bad_fork_cleanup_mm; |
1120 | if ((retval = copy_namespaces(clone_flags, p))) | 1120 | if ((retval = copy_namespaces(clone_flags, p))) |
1121 | goto bad_fork_cleanup_keys; | 1121 | goto bad_fork_cleanup_keys; |
1122 | if ((retval = copy_namespace(clone_flags, p))) | ||
1123 | goto bad_fork_cleanup_namespaces; | ||
1124 | retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs); | 1122 | retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs); |
1125 | if (retval) | 1123 | if (retval) |
1126 | goto bad_fork_cleanup_namespace; | 1124 | goto bad_fork_cleanup_namespaces; |
1127 | 1125 | ||
1128 | p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL; | 1126 | p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL; |
1129 | /* | 1127 | /* |
@@ -1215,7 +1213,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1215 | spin_unlock(¤t->sighand->siglock); | 1213 | spin_unlock(¤t->sighand->siglock); |
1216 | write_unlock_irq(&tasklist_lock); | 1214 | write_unlock_irq(&tasklist_lock); |
1217 | retval = -ERESTARTNOINTR; | 1215 | retval = -ERESTARTNOINTR; |
1218 | goto bad_fork_cleanup_namespace; | 1216 | goto bad_fork_cleanup_namespaces; |
1219 | } | 1217 | } |
1220 | 1218 | ||
1221 | if (clone_flags & CLONE_THREAD) { | 1219 | if (clone_flags & CLONE_THREAD) { |
@@ -1263,8 +1261,6 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1263 | proc_fork_connector(p); | 1261 | proc_fork_connector(p); |
1264 | return p; | 1262 | return p; |
1265 | 1263 | ||
1266 | bad_fork_cleanup_namespace: | ||
1267 | exit_namespace(p); | ||
1268 | bad_fork_cleanup_namespaces: | 1264 | bad_fork_cleanup_namespaces: |
1269 | exit_task_namespaces(p); | 1265 | exit_task_namespaces(p); |
1270 | bad_fork_cleanup_keys: | 1266 | bad_fork_cleanup_keys: |
@@ -1519,10 +1515,9 @@ static int unshare_fs(unsigned long unshare_flags, struct fs_struct **new_fsp) | |||
1519 | */ | 1515 | */ |
1520 | static int unshare_namespace(unsigned long unshare_flags, struct namespace **new_nsp, struct fs_struct *new_fs) | 1516 | static int unshare_namespace(unsigned long unshare_flags, struct namespace **new_nsp, struct fs_struct *new_fs) |
1521 | { | 1517 | { |
1522 | struct namespace *ns = current->namespace; | 1518 | struct namespace *ns = current->nsproxy->namespace; |
1523 | 1519 | ||
1524 | if ((unshare_flags & CLONE_NEWNS) && | 1520 | if ((unshare_flags & CLONE_NEWNS) && ns) { |
1525 | (ns && atomic_read(&ns->count) > 1)) { | ||
1526 | if (!capable(CAP_SYS_ADMIN)) | 1521 | if (!capable(CAP_SYS_ADMIN)) |
1527 | return -EPERM; | 1522 | return -EPERM; |
1528 | 1523 | ||
@@ -1655,8 +1650,8 @@ asmlinkage long sys_unshare(unsigned long unshare_flags) | |||
1655 | } | 1650 | } |
1656 | 1651 | ||
1657 | if (new_ns) { | 1652 | if (new_ns) { |
1658 | ns = current->namespace; | 1653 | ns = current->nsproxy->namespace; |
1659 | current->namespace = new_ns; | 1654 | current->nsproxy->namespace = new_ns; |
1660 | new_ns = ns; | 1655 | new_ns = ns; |
1661 | } | 1656 | } |
1662 | 1657 | ||