HomeFreeBSD

sigtimedwait: Use a unique wait channel for sleeping

Description

sigtimedwait: Use a unique wait channel for sleeping

When a sigtimedwait(2) caller goes to sleep, it uses a wait channel of
p->p_sigacts with the proc lock as the interlock. However, p_sigacts
can be shared between processes if a child is created with
rfork(RFSIGSHARE | RFPROC). Thus we can end up with two threads
sleeping on the same wait channel using different locks, which is not
permitted.

Fix the problem simply by using a process-unique wait channel, following
the example of sigsuspend. The actual wait channel value is irrelevant
here, sleeping threads are awoken using sleepq_abort().

Reported by: syzbot+8c417afabadb50bb8827@syzkaller.appspotmail.com
Reported by: syzbot+1d89fc2a9ef92ef64fa8@syzkaller.appspotmail.com
Reviewed by: kib
MFC after: 1 week
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D31563

Details

Provenance
markjAuthored on Aug 16 2021, 5:15 PM
Reviewer
kib
Differential Revision
D31563: sigtimedwait: Use a unique wait channel for sleeping
Parents
rGd16cb228c1a6: ktls: Fix accounting for TLS 1.0 empty fragments.
Branches
Unknown
Tags
Unknown