• Eric W. Biederman's avatar
    ptrace: Don't change __state · 2500ad1c
    Eric W. Biederman authored
    Stop playing with tsk->__state to remove TASK_WAKEKILL while a ptrace
    command is executing.
    
    Instead remove TASK_WAKEKILL from the definition of TASK_TRACED, and
    implement a new jobctl flag TASK_PTRACE_FROZEN.  This new flag is set
    in jobctl_freeze_task and cleared when ptrace_stop is awoken or in
    jobctl_unfreeze_task (when ptrace_stop remains asleep).
    
    In signal_wake_up add __TASK_TRACED to state along with TASK_WAKEKILL
    when the wake up is for a fatal signal.  Skip adding __TASK_TRACED
    when TASK_PTRACE_FROZEN is not set.  This has the same effect as
    changing TASK_TRACED to __TASK_TRACED as all of the wake_ups that use
    TASK_KILLABLE go through signal_wake_up.
    
    Handle a ptrace_stop being called with a pending fatal signal.
    Previously it would have been handled by schedule simply failing to
    sleep.  As TASK_WAKEKILL is no longer part of TASK_TRACED schedule
    will sleep with a fatal_signal_pending.   The code in signal_wake_up
    guarantees that the code will be awaked by any fatal signal that
    codes after TASK_TRACED is set.
    
    Previously the __state value of __TASK_TRACED was changed to
    TASK_RUNNING when woken up or back to TASK_TRACED when the code was
    left in ptrace_stop.  Now when woken up ptrace_stop now clears
    JOBCTL_PTRACE_FROZEN and when left sleeping ptrace_unfreezed_traced
    clears JOBCTL_PTRACE_FROZEN.
    Tested-by: default avatarKees Cook <keescook@chromium.org>
    Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
    Link: https://lkml.kernel.org/r/20220505182645.497868-10-ebiederm@xmission.comSigned-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    2500ad1c
ptrace.c 37.1 KB