From 1cb2d222c58c284b06effdd87143cc0dd6f83b47 Mon Sep 17 00:00:00 2001 From: jhb Date: Wed, 11 Sep 2002 21:00:56 +0000 Subject: - 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. --- sys/kern/kern_ktrace.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'sys/kern/kern_ktrace.c') 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); -- cgit v1.1