diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index fbea12d7a943..b373322ca497 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -108,8 +108,10 @@ void free_task(struct task_struct *tsk) | |||
| 108 | } | 108 | } |
| 109 | EXPORT_SYMBOL(free_task); | 109 | EXPORT_SYMBOL(free_task); |
| 110 | 110 | ||
| 111 | void __put_task_struct(struct task_struct *tsk) | 111 | void __put_task_struct_cb(struct rcu_head *rhp) |
| 112 | { | 112 | { |
| 113 | struct task_struct *tsk = container_of(rhp, struct task_struct, rcu); | ||
| 114 | |||
| 113 | WARN_ON(!(tsk->exit_state & (EXIT_DEAD | EXIT_ZOMBIE))); | 115 | WARN_ON(!(tsk->exit_state & (EXIT_DEAD | EXIT_ZOMBIE))); |
| 114 | WARN_ON(atomic_read(&tsk->usage)); | 116 | WARN_ON(atomic_read(&tsk->usage)); |
| 115 | WARN_ON(tsk == current); | 117 | WARN_ON(tsk == current); |
| @@ -1060,6 +1062,12 @@ static task_t *copy_process(unsigned long clone_flags, | |||
| 1060 | p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr: NULL; | 1062 | p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr: NULL; |
| 1061 | 1063 | ||
| 1062 | /* | 1064 | /* |
| 1065 | * sigaltstack should be cleared when sharing the same VM | ||
| 1066 | */ | ||
| 1067 | if ((clone_flags & (CLONE_VM|CLONE_VFORK)) == CLONE_VM) | ||
| 1068 | p->sas_ss_sp = p->sas_ss_size = 0; | ||
| 1069 | |||
| 1070 | /* | ||
| 1063 | * Syscall tracing should be turned off in the child regardless | 1071 | * Syscall tracing should be turned off in the child regardless |
| 1064 | * of CLONE_PTRACE. | 1072 | * of CLONE_PTRACE. |
| 1065 | */ | 1073 | */ |
| @@ -1470,9 +1478,7 @@ static int unshare_vm(unsigned long unshare_flags, struct mm_struct **new_mmp) | |||
| 1470 | 1478 | ||
| 1471 | if ((unshare_flags & CLONE_VM) && | 1479 | if ((unshare_flags & CLONE_VM) && |
| 1472 | (mm && atomic_read(&mm->mm_users) > 1)) { | 1480 | (mm && atomic_read(&mm->mm_users) > 1)) { |
| 1473 | *new_mmp = dup_mm(current); | 1481 | return -EINVAL; |
| 1474 | if (!*new_mmp) | ||
| 1475 | return -ENOMEM; | ||
| 1476 | } | 1482 | } |
| 1477 | 1483 | ||
| 1478 | return 0; | 1484 | return 0; |
| @@ -1561,7 +1567,7 @@ asmlinkage long sys_unshare(unsigned long unshare_flags) | |||
| 1561 | 1567 | ||
| 1562 | if (new_sigh) { | 1568 | if (new_sigh) { |
| 1563 | sigh = current->sighand; | 1569 | sigh = current->sighand; |
| 1564 | current->sighand = new_sigh; | 1570 | rcu_assign_pointer(current->sighand, new_sigh); |
| 1565 | new_sigh = sigh; | 1571 | new_sigh = sigh; |
| 1566 | } | 1572 | } |
| 1567 | 1573 | ||
