From a4a639859f6bc14f9f55142b4bd2289b2a56d7f2 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Thu, 12 Mar 2009 09:15:10 -0700 Subject: [PATCH] Fix kernel panic on NULL pointer deref w/ certain ktrace commands, allow -c -f. Fix a kernel panic on a NULL pointer dereference with certain ktrace -c commands. Allow the -c -f combination (taken from FreeBSD). Submitted-by: Stathis Kamperis --- sys/kern/kern_ktrace.c | 22 ++++++++++++---------- usr.bin/ktrace/ktrace.c | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index 4ba27e6..f26cf46 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -338,18 +338,20 @@ ktrace_clear_callback(struct proc *p, void *data) { struct ktrace_clear_info *info = data; - if (info->rootclear) { - if (p->p_tracenode == info->tracenode) { - ktrdestroy(&p->p_tracenode); - p->p_traceflag = 0; - } - } else { - if (p->p_tracenode->kn_vp == info->tracenode->kn_vp) { - if (ktrcanset(curproc, p)) { + if (p->p_tracenode) { + if (info->rootclear) { + if (p->p_tracenode == info->tracenode) { ktrdestroy(&p->p_tracenode); p->p_traceflag = 0; - } else { - info->error = EPERM; + } + } else { + if (p->p_tracenode->kn_vp == info->tracenode->kn_vp) { + if (ktrcanset(curproc, p)) { + ktrdestroy(&p->p_tracenode); + p->p_traceflag = 0; + } else { + info->error = EPERM; + } } } } diff --git a/usr.bin/ktrace/ktrace.c b/usr.bin/ktrace/ktrace.c index bfc2eb9..261d4fb 100644 --- a/usr.bin/ktrace/ktrace.c +++ b/usr.bin/ktrace/ktrace.c @@ -110,7 +110,7 @@ main(int argc, char **argv) argv += optind; argc -= optind; - if ((pidset && *argv) || (!pidset && !*argv)) + if ((pidset && *argv) || (!pidset && clear == NOTSET && !*argv)) usage(); if (inherit) -- 1.7.7.2