diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2026-01-20 15:01:08 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2026-01-20 19:44:54 +0000 |
| commit | 6bb3f208617b58a54e2204eb31bae3f9a86117a7 (patch) | |
| tree | ae93141d895a1f1245cc6395fd73033a0196b4b9 | |
| parent | 466bad427d74e666e85445729b2e63b82e10d18f (diff) | |
ktrace: do not enqueue request if the process' ktrioparams are freed
The p_ktrioparms are freed on termination of tracing. Any ktr requests
added to the queue after that would hang there and leak on the struct
proc recycling, or trigger an assert in the process destructor for debug
builds.
Reported and tested by: pho
Reviewed by: markj
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D54804
| -rw-r--r-- | sys/kern/kern_ktrace.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index 15a8a4ab4fa4..b58e69a3f38e 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -373,11 +373,17 @@ ktr_getrequest(int type) static void ktr_enqueuerequest(struct thread *td, struct ktr_request *req) { + bool sched_ast; mtx_lock(&ktrace_mtx); - STAILQ_INSERT_TAIL(&td->td_proc->p_ktr, req, ktr_list); + sched_ast = td->td_proc->p_ktrioparms != NULL; + if (sched_ast) + STAILQ_INSERT_TAIL(&td->td_proc->p_ktr, req, ktr_list); + else + ktr_freerequest_locked(req); mtx_unlock(&ktrace_mtx); - ast_sched(td, TDA_KTRACE); + if (sched_ast) + ast_sched(td, TDA_KTRACE); } /* |
