• Oleg Nesterov's avatar
    vfork: make it killable · d68b46fe
    Oleg Nesterov authored
    Make vfork() killable.
    
    Change do_fork(CLONE_VFORK) to do wait_for_completion_killable().  If it
    fails we do not return to the user-mode and never touch the memory shared
    with our child.
    
    However, in this case we should clear child->vfork_done before return, we
    use task_lock() in do_fork()->wait_for_vfork_done() and
    complete_vfork_done() to serialize with each other.
    
    Note: now that we use task_lock() we don't really need completion, we
    could turn task->vfork_done into "task_struct *wake_up_me" but this needs
    some complications.
    
    NOTE: this and the next patches do not affect in-kernel users of
    CLONE_VFORK, kernel threads run with all signals ignored including
    SIGKILL/SIGSTOP.
    
    However this is obviously the user-visible change.  Not only a fatal
    signal can kill the vforking parent, a sub-thread can do execve or
    exit_group() and kill the thread sleeping in vfork().
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Acked-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d68b46fe
fork.c 43.1 KB