• Eric W. Biederman's avatar
    ptrace: Document that wait_task_inactive can't fail · 7b0fe136
    Eric W. Biederman authored
    After ptrace_freeze_traced succeeds it is known that the tracee
    has a __state value of __TASK_TRACED and that no __ptrace_unlink will
    happen because the tracer is waiting for the tracee, and the tracee is
    in ptrace_stop.
    
    The function ptrace_freeze_traced can succeed at any point after
    ptrace_stop has set TASK_TRACED and dropped siglock.  The read_lock on
    tasklist_lock only excludes ptrace_attach.
    
    This means that the !current->ptrace which executes under a read_lock
    of tasklist_lock will never see a ptrace_freeze_trace as the tracer
    must have gone away before the tasklist_lock was taken and
    ptrace_attach can not occur until the read_lock is dropped.  As
    ptrace_freeze_traced depends upon ptrace_attach running before it can
    run that excludes ptrace_freeze_traced until __state is set to
    TASK_RUNNING.  This means that task_is_traced will fail in
    ptrace_freeze_attach and ptrace_freeze_attached will fail.
    
    On the current->ptrace branch of ptrace_stop which will be reached any
    time after ptrace_freeze_traced has succeed it is known that __state
    is __TASK_TRACED and schedule() will be called with that state.
    
    Use a WARN_ON_ONCE to document that wait_task_inactive(TASK_TRACED)
    should never fail.  Remove the stale comment about may_ptrace_stop.
    
    Strictly speaking this is not true because if PREEMPT_RT is enabled
    wait_task_inactive can fail because __state can be changed.  I don't
    see this as a problem as the ptrace code is currently broken on
    PREMPT_RT, and this is one of the issues.  Failing and warning when
    the assumptions of the code are broken is good.
    Tested-by: default avatarKees Cook <keescook@chromium.org>
    Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
    Link: https://lkml.kernel.org/r/20220505182645.497868-8-ebiederm@xmission.comSigned-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    7b0fe136
ptrace.c 37.2 KB