aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2026-01-20 15:01:08 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2026-01-20 19:44:54 +0000
commit6bb3f208617b58a54e2204eb31bae3f9a86117a7 (patch)
treeae93141d895a1f1245cc6395fd73033a0196b4b9
parent466bad427d74e666e85445729b2e63b82e10d18f (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.c10
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);
}
/*