summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_ktrace.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2002-09-11 21:00:56 +0000
committerjhb <jhb@FreeBSD.org>2002-09-11 21:00:56 +0000
commit1cb2d222c58c284b06effdd87143cc0dd6f83b47 (patch)
treeb2a6df90ebda4053dd223e26cb0a860fa00b24fa /sys/kern/kern_ktrace.c
parent5f504840803fc609bcfffc0d1c468841b5450f7a (diff)
downloadFreeBSD-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/kern_ktrace.c')
-rw-r--r--sys/kern/kern_ktrace.c19
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);
OpenPOWER on IntegriCloud