thread_single(9): decline external requests for traced or debugger-stopped procs

Debugger has the powers to cause unbound delay in single-threading,
which then blocks the threaded taskqueue.  The reproducer is
`truss -f timeout 2 sleep 10`.

Reported by:	mjg
Reviewed by:	markj
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D44523
This commit is contained in:
Konstantin Belousov 2024-03-27 14:29:25 +02:00
parent 0cade55660
commit 9241ebc796

View file

@ -1248,6 +1248,9 @@ thread_single(struct proc *p, int mode)
return (1);
msleep(&p->p_flag, &p->p_mtx, PCATCH, "thrsgl", 0);
}
if ((p->p_flag & (P_STOPPED_SIG | P_TRACED)) != 0 ||
(p->p_flag2 & P2_WEXIT) != 0)
return (1);
} else if ((p->p_flag & P_HADTHREADS) == 0)
return (0);
if (p->p_singlethread != NULL && p->p_singlethread != td)