• Eric W. Biederman's avatar
    ptrace: Remove arch_ptrace_attach · 16cc1bc6
    Eric W. Biederman authored
    The last remaining implementation of arch_ptrace_attach is ia64's
    ptrace_attach_sync_user_rbs which was added at the end of 2007 in
    commit aa91a2e9 ("[IA64] Synchronize RBS on PTRACE_ATTACH").
    
    Reading the comments and examining the code ptrace_attach_sync_user_rbs
    has the sole purpose of saving registers to the stack when ptrace_attach
    changes TASK_STOPPED to TASK_TRACED.  In all other cases arch_ptrace_stop
    takes care of the register saving.
    
    In commit d79fdd6d ("ptrace: Clean transitions between TASK_STOPPED and TRACED")
    modified ptrace_attach to wake up the thread and enter ptrace_stop normally even
    when the thread starts out stopped.
    
    This makes ptrace_attach_sync_user_rbs completely unnecessary.  So just
    remove it.
    
    I read through the code to verify that ptrace_attach_sync_user_rbs is
    unnecessary.  What I found is that the code is quite dead.
    
    Reading ptrace_attach_sync_user_rbs it is easy to see that the it does
    nothing unless __state == TASK_STOPPED.
    
    Calling arch_ptrace_attach (aka ptrace_attach_sync_user_rbs) after
    ptrace_traceme it is easy to see that because we are talking about the
    current process the value of __state is TASK_RUNNING.  Which means
    ptrace_attach_sync_user_rbs does nothing.
    
    The only other call of arch_ptrace_attach (aka
    ptrace_attach_sync_user_rbs) is after ptrace_attach.
    
    If the task is running (and PTRACE_SEIZE is not specified), a SIGSTOP
    is sent which results in do_signal_stop setting JOBCTL_TRAP_STOP on
    the target task (as it is ptraced) and the target task stopping
    in ptrace_stop with __state == TASK_TRACED.
    
    If the task was already stopped then ptrace_attach sets
    JOBCTL_TRAPPING and JOBCTL_TRAP_STOP, wakes it out of __TASK_STOPPED,
    and waits until the JOBCTL_TRAPPING_BIT is clear.  At which point
    the task stops in ptrace_stop.
    
    In both cases there are a couple of funning excpetions such as if the
    traced task receiveds a SIGCONT, or is set a fatal signal.
    
    However in all of those cases the tracee never stops in __state
    TASK_STOPPED.  Which is a long way of saying that ptrace_attach_sync_user_rbs
    is guaranteed never to do anything.
    
    Cc: linux-ia64@vger.kernel.org
    Tested-by: default avatarKees Cook <keescook@chromium.org>
    Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
    Link: https://lkml.kernel.org/r/20220505182645.497868-4-ebiederm@xmission.comSigned-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    16cc1bc6
ptrace.c 37.5 KB