• Eric W. Biederman's avatar
    ptrace: Admit ptrace_stop can generate spuriuos SIGTRAPs · 57b6de08
    Eric W. Biederman authored
    Long ago and far away there was a BUG_ON at the start of ptrace_stop
    that did "BUG_ON(!(current->ptrace & PT_PTRACED));" [1].  The BUG_ON
    had never triggered but examination of the code showed that the BUG_ON
    could actually trigger.  To complement removing the BUG_ON an attempt
    to better handle the race was added.
    
    The code detected the tracer had gone away and did not call
    do_notify_parent_cldstop.  The code also attempted to prevent
    ptrace_report_syscall from sending spurious SIGTRAPs when the tracer
    went away.
    
    The code to detect when the tracer had gone away before sending a
    signal to tracer was a legitimate fix and continues to work to this
    date.
    
    The code to prevent sending spurious SIGTRAPs is a failure.  At the
    time and until today the code only catches it when the tracer goes
    away after siglock is dropped and before read_lock is acquired.  If
    the tracer goes away after read_lock is dropped a spurious SIGTRAP can
    still be sent to the tracee.  The tracer going away after read_lock
    is dropped is the far likelier case as it is the bigger window.
    
    Given that the attempt to prevent the generation of a SIGTRAP was a
    failure and continues to be a failure remove the code that attempts to
    do that.  This simplifies the code in ptrace_stop and makes
    ptrace_stop much easier to reason about.
    
    To successfully deal with the tracer going away, all of the tracer's
    instrumentation of the child would need to be removed, and reliably
    detecting when the tracer has set a signal to continue with would need
    to be implemented.
    
    [1] 66519f54 ("[PATCH] fix ptracer death race yielding bogus BUG_ON")
    History-Tree: https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.gitTested-by: default avatarKees Cook <keescook@chromium.org>
    Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
    Link: https://lkml.kernel.org/r/20220505182645.497868-9-ebiederm@xmission.comSigned-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    57b6de08
signal.c 123 KB