lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0781/1039] signal: In get_signal test for signal_group_exit every time through the loop
    Date
    From: Eric W. Biederman <ebiederm@xmission.com>

    [ Upstream commit e7f7c99ba911f56bc338845c1cd72954ba591707 ]

    Recently while investigating a problem with rr and signals I noticed
    that siglock is dropped in ptrace_signal and get_signal does not jump
    to relock.

    Looking farther to see if the problem is anywhere else I see that
    do_signal_stop also returns if signal_group_exit is true. I believe
    that test can now never be true, but it is a bit hard to trace
    through and be certain.

    Testing signal_group_exit is not expensive, so move the test for
    signal_group_exit into the for loop inside of get_signal to ensure
    the test is never skipped improperly.

    This has been a potential problem since I added the test for
    signal_group_exit was added.

    Fixes: 35634ffa1751 ("signal: Always notice exiting tasks")
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Link: https://lkml.kernel.org/r/875yssekcd.fsf_-_@email.froward.int.ebiederm.org
    Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/signal.c | 20 ++++++++++----------
    1 file changed, 10 insertions(+), 10 deletions(-)

    diff --git a/kernel/signal.c b/kernel/signal.c
    index dfcee3888b00e..cf97b9c4d665a 100644
    --- a/kernel/signal.c
    +++ b/kernel/signal.c
    @@ -2684,19 +2684,19 @@ relock:
    goto relock;
    }

    - /* Has this task already been marked for death? */
    - if (signal_group_exit(signal)) {
    - ksig->info.si_signo = signr = SIGKILL;
    - sigdelset(&current->pending.signal, SIGKILL);
    - trace_signal_deliver(SIGKILL, SEND_SIG_NOINFO,
    - &sighand->action[SIGKILL - 1]);
    - recalc_sigpending();
    - goto fatal;
    - }
    -
    for (;;) {
    struct k_sigaction *ka;

    + /* Has this task already been marked for death? */
    + if (signal_group_exit(signal)) {
    + ksig->info.si_signo = signr = SIGKILL;
    + sigdelset(&current->pending.signal, SIGKILL);
    + trace_signal_deliver(SIGKILL, SEND_SIG_NOINFO,
    + &sighand->action[SIGKILL - 1]);
    + recalc_sigpending();
    + goto fatal;
    + }
    +
    if (unlikely(current->jobctl & JOBCTL_STOP_PENDING) &&
    do_signal_stop(0))
    goto relock;
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-01-25 04:10    [W:4.222 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site