]> git.baikalelectronics.ru Git - kernel.git/commit
s390/signal: switch to using vdso for sigreturn and syscall restart
authorSven Schnelle <svens@linux.ibm.com>
Fri, 25 Jun 2021 13:02:08 +0000 (15:02 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Thu, 8 Jul 2021 20:09:47 +0000 (22:09 +0200)
commit394258e96f2a067fea01875351465dc676494f9b
treeeb0c060e0678fb18fa4eeadd2d9b2000757f6913
parent8ca3a671adb7ef947a21c73ef55e4aaeefc652c7
s390/signal: switch to using vdso for sigreturn and syscall restart

with generic entry, there's a bug when it comes to restarting of signals.
The failing sequence is:

a) a signal is coming in, and no handler is registered, so the lower
   part of arch_do_signal_or_restart() in arch/s390/kernel/signal.c
   sets PIF_SYSCALL_RESTART.

b) a second signal gets pending while the kernel is still in the exit
   loop, and for that one, a handler exists.

c) The first part of arch_do_signal_or_restart() is called. That part
   calls handle_signal(), which sets up stack + registers for handling
   the signal.

d) __do_syscall() in arch/s390/kernel/syscall.c checks for
   PIF_SYSCALL_RESTART right before leaving to userspace. If it is set,
   it restart's the syscall. However, the registers are already setup
   for handling a signal from c). The syscall is now restarted with the
   wrong arguments.

Change the code to:

- use vdso for syscall_restart() instead of PIF_SYSCALL_RESTART because
  we cannot rewind and go back to userspace on s390 because the system call
  number might be encoded in the svc instruction.
- for all other syscalls we rewind the PSW and return to userspace.

Cc: <stable@kernel.org> # v5.12+ c548a76b78b0: s390/vdso: always enable vdso
Cc: <stable@kernel.org> # v5.12+ 4acd197b0454: s390/vdso64: add sigreturn,rt_sigreturn and restart_syscall
Cc: <stable@kernel.org> # v5.12+ a7ccd02195be: s390/vdso: rename VDSO64_LBASE to VDSO_LBASE
Cc: <stable@kernel.org> # v5.12+ 8ca3a671adb7: s390/vdso: add minimal compat vdso
Cc: <stable@kernel.org> # v5.12+
Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/kernel/compat_signal.c
arch/s390/kernel/process.c
arch/s390/kernel/signal.c
arch/s390/kernel/syscall.c