• E
    signal: Restore the stop PTRACE_EVENT_EXIT · a2b3e2c0
    Eric W. Biederman 提交于
    commit cf43a757fd49442bc38f76088b70c2299eed2c2f upstream.
    
    In the middle of do_exit() there is there is a call
    "ptrace_event(PTRACE_EVENT_EXIT, code);" That call places the process
    in TACKED_TRACED aka "(TASK_WAKEKILL | __TASK_TRACED)" and waits for
    for the debugger to release the task or SIGKILL to be delivered.
    
    Skipping past dequeue_signal when we know a fatal signal has already
    been delivered resulted in SIGKILL remaining pending and
    TIF_SIGPENDING remaining set.  This in turn caused the
    scheduler to not sleep in PTACE_EVENT_EXIT as it figured
    a fatal signal was pending.  This also caused ptrace_freeze_traced
    in ptrace_check_attach to fail because it left a per thread
    SIGKILL pending which is what fatal_signal_pending tests for.
    
    This difference in signal state caused strace to report
    strace: Exit of unknown pid NNNNN ignored
    
    Therefore update the signal handling state like dequeue_signal
    would when removing a per thread SIGKILL, by removing SIGKILL
    from the per thread signal mask and clearing TIF_SIGPENDING.
    Acked-by: NOleg Nesterov <oleg@redhat.com>
    Reported-by: NOleg Nesterov <oleg@redhat.com>
    Reported-by: NIvan Delalande <colona@arista.com>
    Cc: stable@vger.kernel.org
    Fixes: 35634ffa1751 ("signal: Always notice exiting tasks")
    Signed-off-by: N"Eric W. Biederman" <ebiederm@xmission.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    a2b3e2c0
signal.c 104.3 KB