lkml.org 
[lkml]   [2022]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 055/141] riscv: fix a nasty sigreturn bug...
    Date
    From: Al Viro <viro@zeniv.linux.org.uk>

    commit 762df359aa5849e010ef04c3ed79d57588ce17d9 upstream.

    riscv has an equivalent of arm bug fixed by 653d48b22166 ("arm: fix
    really nasty sigreturn bug"); if signal gets caught by an interrupt that
    hits when we have the right value in a0 (-513), *and* another signal
    gets delivered upon sigreturn() (e.g. included into the blocked mask for
    the first signal and posted while the handler had been running), the
    syscall restart logics will see regs->cause equal to EXC_SYSCALL (we are
    in a syscall, after all) and a0 already restored to its original value
    (-513, which happens to be -ERESTARTNOINTR) and assume that we need to
    apply the usual syscall restart logics.

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Fixes: e2c0cdfba7f6 ("RISC-V: User-facing API")
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/YxJEiSq%2FCGaL6Gm9@ZenIV/
    Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/riscv/kernel/signal.c | 2 ++
    1 file changed, 2 insertions(+)

    --- a/arch/riscv/kernel/signal.c
    +++ b/arch/riscv/kernel/signal.c
    @@ -121,6 +121,8 @@ SYSCALL_DEFINE0(rt_sigreturn)
    if (restore_altstack(&frame->uc.uc_stack))
    goto badframe;

    + regs->cause = -1UL;
    +
    return regs->a0;

    badframe:

    \
     
     \ /
      Last update: 2022-09-26 13:03    [W:4.074 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site