Fix a TOCTOU race that causes signals to be delivered more than once.
authormpi <mpi@openbsd.org>
Mon, 26 Feb 2018 13:33:25 +0000 (13:33 +0000)
committermpi <mpi@openbsd.org>
Mon, 26 Feb 2018 13:33:25 +0000 (13:33 +0000)
commit879edb36e9a953e453e7b19ac6c72ad3ba21655e
treefbd24b156cd4e3614d83f9097d2be5ca93d54e90
parentee781228fc3270e56d1caf992965d0f4700149cb
Fix a TOCTOU race that causes signals to be delivered more than once.

The race is only triggerable if one of the threads of a multi-threaded
program is in the middle of a NOLOCK syscall when a signal is received.

The problem is that `ps_sigact' is shared between threads so its access
should be serialized.  In the case of SA_RESETHAND, the handler is reset
when a signal is delivered, so delivering the signal twice would put the
process in an "impossible" state where some threads were stopped and some
were waiting for the others to die.

Serialize signal checking & processing with the KERNEL_LOCK() for now,
and introduce postsig_done() gypped from FreeBSD, to make sure the lock
is held when resetting the handler.

Bug report from espie@, ok visa@
sys/kern/kern_sig.c
sys/sys/signalvar.h