diff options
author | jhb <jhb@FreeBSD.org> | 2002-09-11 21:00:56 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2002-09-11 21:00:56 +0000 |
commit | 1cb2d222c58c284b06effdd87143cc0dd6f83b47 (patch) | |
tree | b2a6df90ebda4053dd223e26cb0a860fa00b24fa /sys/kern | |
parent | 5f504840803fc609bcfffc0d1c468841b5450f7a (diff) | |
download | FreeBSD-src-1cb2d222c58c284b06effdd87143cc0dd6f83b47.zip FreeBSD-src-1cb2d222c58c284b06effdd87143cc0dd6f83b47.tar.gz |
- Change utrace ktrace events to malloc the work buffer before getting a
request structure.
- Re-optimize the case of utrace being disabled by doing an explicit
KTRPOINT check instead of relying on the one in ktr_getrequest() so that
we don't waste time on a malloc in the non-tracing case.
- Change utrace() to return an error if the copyin() fails. Before it
would just ignore the request but still return success. This last is
a change in behavior and can be backed out if necessary.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_ktrace.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index f58dfce..537072d 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -613,21 +613,22 @@ utrace(td, uap) #ifdef KTRACE struct ktr_request *req; void *cp; + int error; + if (!KTRPOINT(td, KTR_USER)) + return (0); if (uap->len > KTR_USER_MAXLEN) return (EINVAL); + cp = malloc(uap->len, M_KTRACE, M_WAITOK); + error = copyin(uap->addr, cp, uap->len); + if (error) + return (error); req = ktr_getrequest(KTR_USER); if (req == NULL) return (0); - cp = malloc(uap->len, M_KTRACE, M_WAITOK); - if (!copyin(uap->addr, cp, uap->len)) { - req->ktr_header.ktr_buffer = cp; - req->ktr_header.ktr_len = uap->len; - ktr_submitrequest(req); - } else { - ktr_freerequest(req); - td->td_inktrace = 0; - } + req->ktr_header.ktr_buffer = cp; + req->ktr_header.ktr_len = uap->len; + ktr_submitrequest(req); return (0); #else return (ENOSYS); |