diff options
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 40 |
1 files changed, 13 insertions, 27 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index bf46287c91a4..086fe73ad6bd 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -351,7 +351,6 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
351 | struct rb_node **rb_link, *rb_parent; | 351 | struct rb_node **rb_link, *rb_parent; |
352 | int retval; | 352 | int retval; |
353 | unsigned long charge; | 353 | unsigned long charge; |
354 | struct mempolicy *pol; | ||
355 | 354 | ||
356 | uprobe_start_dup_mmap(); | 355 | uprobe_start_dup_mmap(); |
357 | down_write(&oldmm->mmap_sem); | 356 | down_write(&oldmm->mmap_sem); |
@@ -400,11 +399,9 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
400 | goto fail_nomem; | 399 | goto fail_nomem; |
401 | *tmp = *mpnt; | 400 | *tmp = *mpnt; |
402 | INIT_LIST_HEAD(&tmp->anon_vma_chain); | 401 | INIT_LIST_HEAD(&tmp->anon_vma_chain); |
403 | pol = mpol_dup(vma_policy(mpnt)); | 402 | retval = vma_dup_policy(mpnt, tmp); |
404 | retval = PTR_ERR(pol); | 403 | if (retval) |
405 | if (IS_ERR(pol)) | ||
406 | goto fail_nomem_policy; | 404 | goto fail_nomem_policy; |
407 | vma_set_policy(tmp, pol); | ||
408 | tmp->vm_mm = mm; | 405 | tmp->vm_mm = mm; |
409 | if (anon_vma_fork(tmp, mpnt)) | 406 | if (anon_vma_fork(tmp, mpnt)) |
410 | goto fail_nomem_anon_vma_fork; | 407 | goto fail_nomem_anon_vma_fork; |
@@ -472,7 +469,7 @@ out: | |||
472 | uprobe_end_dup_mmap(); | 469 | uprobe_end_dup_mmap(); |
473 | return retval; | 470 | return retval; |
474 | fail_nomem_anon_vma_fork: | 471 | fail_nomem_anon_vma_fork: |
475 | mpol_put(pol); | 472 | mpol_put(vma_policy(tmp)); |
476 | fail_nomem_policy: | 473 | fail_nomem_policy: |
477 | kmem_cache_free(vm_area_cachep, tmp); | 474 | kmem_cache_free(vm_area_cachep, tmp); |
478 | fail_nomem: | 475 | fail_nomem: |
@@ -522,7 +519,7 @@ static void mm_init_aio(struct mm_struct *mm) | |||
522 | { | 519 | { |
523 | #ifdef CONFIG_AIO | 520 | #ifdef CONFIG_AIO |
524 | spin_lock_init(&mm->ioctx_lock); | 521 | spin_lock_init(&mm->ioctx_lock); |
525 | INIT_HLIST_HEAD(&mm->ioctx_list); | 522 | mm->ioctx_table = NULL; |
526 | #endif | 523 | #endif |
527 | } | 524 | } |
528 | 525 | ||
@@ -1173,13 +1170,16 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1173 | return ERR_PTR(-EINVAL); | 1170 | return ERR_PTR(-EINVAL); |
1174 | 1171 | ||
1175 | /* | 1172 | /* |
1176 | * If the new process will be in a different pid namespace | 1173 | * If the new process will be in a different pid or user namespace |
1177 | * don't allow the creation of threads. | 1174 | * do not allow it to share a thread group or signal handlers or |
1175 | * parent with the forking task. | ||
1178 | */ | 1176 | */ |
1179 | if ((clone_flags & (CLONE_VM|CLONE_NEWPID)) && | 1177 | if (clone_flags & (CLONE_SIGHAND | CLONE_PARENT)) { |
1180 | (task_active_pid_ns(current) != | 1178 | if ((clone_flags & (CLONE_NEWUSER | CLONE_NEWPID)) || |
1181 | current->nsproxy->pid_ns_for_children)) | 1179 | (task_active_pid_ns(current) != |
1182 | return ERR_PTR(-EINVAL); | 1180 | current->nsproxy->pid_ns_for_children)) |
1181 | return ERR_PTR(-EINVAL); | ||
1182 | } | ||
1183 | 1183 | ||
1184 | retval = security_task_create(clone_flags); | 1184 | retval = security_task_create(clone_flags); |
1185 | if (retval) | 1185 | if (retval) |
@@ -1576,15 +1576,6 @@ long do_fork(unsigned long clone_flags, | |||
1576 | long nr; | 1576 | long nr; |
1577 | 1577 | ||
1578 | /* | 1578 | /* |
1579 | * Do some preliminary argument and permissions checking before we | ||
1580 | * actually start allocating stuff | ||
1581 | */ | ||
1582 | if (clone_flags & (CLONE_NEWUSER | CLONE_NEWPID)) { | ||
1583 | if (clone_flags & (CLONE_THREAD|CLONE_PARENT)) | ||
1584 | return -EINVAL; | ||
1585 | } | ||
1586 | |||
1587 | /* | ||
1588 | * Determine whether and which event to report to ptracer. When | 1579 | * Determine whether and which event to report to ptracer. When |
1589 | * called from kernel_thread or CLONE_UNTRACED is explicitly | 1580 | * called from kernel_thread or CLONE_UNTRACED is explicitly |
1590 | * requested, no event is reported; otherwise, report if the event | 1581 | * requested, no event is reported; otherwise, report if the event |
@@ -1825,11 +1816,6 @@ SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags) | |||
1825 | if (unshare_flags & CLONE_NEWUSER) | 1816 | if (unshare_flags & CLONE_NEWUSER) |
1826 | unshare_flags |= CLONE_THREAD | CLONE_FS; | 1817 | unshare_flags |= CLONE_THREAD | CLONE_FS; |
1827 | /* | 1818 | /* |
1828 | * If unsharing a pid namespace must also unshare the thread. | ||
1829 | */ | ||
1830 | if (unshare_flags & CLONE_NEWPID) | ||
1831 | unshare_flags |= CLONE_THREAD; | ||
1832 | /* | ||
1833 | * If unsharing a thread from a thread group, must also unshare vm. | 1819 | * If unsharing a thread from a thread group, must also unshare vm. |
1834 | */ | 1820 | */ |
1835 | if (unshare_flags & CLONE_THREAD) | 1821 | if (unshare_flags & CLONE_THREAD) |