kernel - Fix signal masking race assertion panic w/vkernel
authorMatthew Dillon <dillon@apollo.backplane.com>
Sun, 1 Apr 2012 01:30:13 +0000 (18:30 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Sun, 1 Apr 2012 01:30:13 +0000 (18:30 -0700)
commit6562e2d87bfc5428fec4426aa343ea315ab88941
treedbc2263ce528b9b909cb6a934eb26be3b10f2a0f
parent9bbdde3598baabd3206445e589eb185bfed745d2
kernel - Fix signal masking race assertion panic w/vkernel

* sigsuspend() and pselect() record the old signal mask in order to
  allow an interrupting signal to run its handler before the old mask
  is restored.

* When multiple threads are present a race can ensue where another thread
  changes the signal handler after sigsuspend() or pselect() have interrupted,
  but before they are able to process the signal.

* If the signal is no longer enabled the old signal mask is not restored
  on system call return, resulting in an assertion and panic.

* Fix the problem by checking the flag and restoring the old signal mask
  on return (rather than asserting when the flag is found to be non-zero
  on return).

Reported-by: Venkatesh Srinivas
sys/platform/pc32/i386/trap.c
sys/platform/pc64/x86_64/trap.c
sys/platform/vkernel/i386/trap.c
sys/platform/vkernel64/x86_64/trap.c