On Thu, Jun 07, 2018 at 12:32:05PM +0100, Dave P Martin wrote: > Commit 17c2895 ("arm64: Abstract syscallno manipulation") abstracts > out the pt_regs.syscallno value for a syscall cancelled by a tracer > as NO_SYSCALL, and provides helpers to set and check for this > condition. However, the way this was implemented has the > unintended side-effect of disabling part of the syscall restart > logic. > > This comes about because the second in_syscall() check in > do_signal() re-evaluates the "in a syscall" condition based on the > updated pt_regs instead of the original pt_regs. forget_syscall() > is explicitly called prior to the second check in order to prevent > restart logic in the ret_to_user path being spuriously triggered, > which means that the second in_syscall() check always yields false. > > This triggers a failure in > tools/testing/selftests/seccomp/seccomp_bpf.c, when using ptrace to > suppress a signal that interrups a nanosleep() syscall. > > Misbehaviour of this type is only expected in the case where a > tracer suppresses a signal and the target process is either being > single-stepped or the interrupted syscall attempts to restart via > -ERESTARTBLOCK. > > This patch restores the old behaviour by performing the > in_syscall() check only once at the start of the function. > > Fixes: 17c289586009 ("arm64: Abstract syscallno manipulation") > Signed-off-by: Dave Martin <Dave.Martin@xxxxxxx> > Reported-by: Sumit Semwal <sumit.semwal@xxxxxxxxxx> > Cc: Will Deacon <will.deacon@xxxxxxx> > Cc: Catalin Marinas <catalin.marinas@xxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> # 4.14.x- Applied. Thanks. -- Catalin