From 1690b19512cc7ab8935725d8e595faf52fc662aa Mon Sep 17 00:00:00 2001 From: claudio Date: Wed, 29 Jun 2022 10:48:22 +0000 Subject: [PATCH] Move the deep check back into the loop. There are ways that even though we're deep the code will SSTOP and sleep and then on wakeup we need to recheck the deep conditions. Issue analyzed and OK by mpi@ Reported-by: syzbot+f7634539e73108238c2a@syzkaller.appspotmail.com --- sys/kern/kern_sig.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 9516b02fb0e..e6eee8ff810 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sig.c,v 1.297 2022/06/28 12:08:17 claudio Exp $ */ +/* $OpenBSD: kern_sig.c,v 1.298 2022/06/29 10:48:22 claudio Exp $ */ /* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */ /* @@ -2020,15 +2020,15 @@ single_thread_check_locked(struct proc *p, int deep, int s) SCHED_ASSERT_LOCKED(); if (pr->ps_single != NULL && pr->ps_single != p) { - /* if we're in deep, we need to unwind to the edge */ - if (deep) { - if (pr->ps_flags & PS_SINGLEUNWIND) - return (ERESTART); - if (pr->ps_flags & PS_SINGLEEXIT) - return (EINTR); - } - do { + /* if we're in deep, we need to unwind to the edge */ + if (deep) { + if (pr->ps_flags & PS_SINGLEUNWIND) + return (ERESTART); + if (pr->ps_flags & PS_SINGLEEXIT) + return (EINTR); + } + if (atomic_dec_int_nv(&pr->ps_singlecount) == 0) wakeup(&pr->ps_singlecount); -- 2.20.1