Before coredump or in pledge_fail use SINGLE_UNWIND to stop all threads.
authorclaudio <claudio@openbsd.org>
Tue, 19 Sep 2023 10:43:33 +0000 (10:43 +0000)
committerclaudio <claudio@openbsd.org>
Tue, 19 Sep 2023 10:43:33 +0000 (10:43 +0000)
commitde92f022b000940561918115be1183c1ac9f2e18
tree1ddba42ca269ef0315c1882e88896cccacb62413
parentce6274be5871f0e76803d9d69180aac679b389cd
Before coredump or in pledge_fail use SINGLE_UNWIND to stop all threads.

SINGLE_UNWIND unwinds to the kernel boundary. On the other hand
SINGLE_SUSPEND will sleep inside tsleep(9) and other sleep functions.
Since the code will exit1() very soon after it is better to already unwind.
Now one could argue that for coredumps all threads should stop asap to
get a clean dump. Using SINGLE_UNWIND the sleep will fail with ERESTART
and no copyout should happen in that case.

This is a bit of a workaround since SINGLE_SUSPEND has a small race
where single_thread_wait() returns before all threads are really stopped.
When SINGLE_EXIT is called quickly after this can blow up inside
sleep_finish.

Reported-by: syzbot+3ef066fcfaf991f2ac2c@syzkaller.appspotmail.com
OK mpi@ kettenis@
sys/kern/kern_pledge.c
sys/kern/kern_sig.c