]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Fetch the sigfastblock value in syscalls that wait for signals
authorJonathan T. Looney <jtl@FreeBSD.org>
Fri, 12 Mar 2021 18:14:17 +0000 (18:14 +0000)
committerJonathan T. Looney <jtl@FreeBSD.org>
Tue, 30 Mar 2021 23:39:57 +0000 (23:39 +0000)
commita25c17022e2d6344dcbc6192af276d2798d76d44
treef75343f4d8ee749fbf879a66d74ab266095edff3
parent145ca12d22a40a9136ba6cd1ce434d3d044bddea
Fetch the sigfastblock value in syscalls that wait for signals

We have seen several cases of processes which have become "stuck" in
kern_sigsuspend(). When this occurs, the kernel's td_sigblock_val
is set to 0x10 (one block outstanding) and the userspace copy of the
word is set to 0 (unblocked). Because the kernel's cached value
shows that signals are blocked, kern_sigsuspend() blocks almost all
signals, which means the process hangs indefinitely in sigsuspend().

It is not entirely clear what is causing this condition to occur.
However, it seems to make sense to add some protection against this
case by fetching the latest sigfastblock value from userspace for
syscalls which will sleep waiting for signals. Here, the change is
applied to kern_sigsuspend() and kern_sigtimedwait().

(cherry picked from commit dbec10e08808e375365fb2a2462f306e0cdfda32)
sys/kern/kern_sig.c