• Tejun Heo's avatar
    ptrace: Make do_signal_stop() use ptrace_stop() if the task is being ptraced · 5224fa36
    Tejun Heo authored
    A ptraced task would still stop at do_signal_stop() when it's stopping
    for stop signals and do_signal_stop() behaves the same whether the
    task is ptraced or not.  However, in addition to stopping,
    ptrace_stop() also does ptrace specific stuff like calling
    architecture specific callbacks, so this behavior makes the code more
    fragile and difficult to understand.
    
    This patch makes do_signal_stop() test whether the task is ptraced and
    use ptrace_stop() if so.  This renders tracehook_notify_jctl() rather
    pointless as the ptrace notification is now handled by ptrace_stop()
    regardless of the return value from the tracehook.  It probably is a
    good idea to update it.
    
    This doesn't solve the whole problem as tasks already in stopped state
    would stay in the regular stop when ptrace attached.  That part will
    be handled by the next patch.
    
    Oleg pointed out that this makes a userland-visible change.  Before,
    SIGCONT would be able to wake up a task in group stop even if the task
    is ptraced if the tracer hasn't issued another ptrace command
    afterwards (as the next ptrace commands transitions the state into
    TASK_TRACED which ignores SIGCONT wakeups).  With this and the next
    patch, SIGCONT may race with the transition into TASK_TRACED and is
    ignored if the tracee already entered TASK_TRACED.
    
    Another userland visible change of this and the next patch is that the
    ptracee's state would now be TASK_TRACED where it used to be
    TASK_STOPPED, which is visible via fs/proc.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarOleg Nesterov <oleg@redhat.com>
    Cc: Roland McGrath <roland@redhat.com>
    Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
    5224fa36
signal.c 71.3 KB