Extend single_thread_set() mode with additional flag attributes.
authorclaudio <claudio@openbsd.org>
Fri, 29 Sep 2023 12:47:34 +0000 (12:47 +0000)
committerclaudio <claudio@openbsd.org>
Fri, 29 Sep 2023 12:47:34 +0000 (12:47 +0000)
commita556b217a50965b6a5275259b2f0da86fce3a69d
treea8cbfcee29cb14bb64228c8c5f3e0a3092ae3775
parenteabb0bcf14aa5200c83aca516df0e762e201ccc3
Extend single_thread_set() mode with additional flag attributes.

The mode can now be or-ed with SINGLE_DEEP or SINGLE_NOWAIT to alter
the behaviour of single_thread_set(). This allows explicit control
of the SINGLE_DEEP behaviour.

If SINGLE_DEEP is set the deep flag is passed to the initial check call
and by that the check will error out instead of suspending (SINGLE_UNWIND)
or exiting (SINGLE_EXIT). The SINGLE_DEEP flag is required in calls to
single_thread_set() outside of userret. E.g. at the start of sys_execve
because the proc is not allowed to call exit1() in that location.

SINGLE_NOWAIT skips the wait at the end of single_thread_set() and therefor
returns BEFORE all threads have been parked. Currently this is only used by
the ptrace code and should not be used anywhere else. Not waiting for all
threads to settle is asking for trouble.

This solves an issue by using SINGLE_UNWIND in the coredump case where
the code should actually exit in case another thread crashed moments earlier.
Also the SINGLE_UNWIND in pledge_fail() is now marked SINGLE_DEEP since
the call to pledge_fail() is for sure not at the kernel boundary.

OK mpi@
sys/kern/kern_exec.c
sys/kern/kern_exit.c
sys/kern/kern_pledge.c
sys/kern/kern_sig.c
sys/sys/proc.h