diff options
author | jhb <jhb@FreeBSD.org> | 2002-08-01 13:35:38 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2002-08-01 13:35:38 +0000 |
commit | a20667249ea3dd50ed661b39d30476958a826d67 (patch) | |
tree | 26f84d226370d3aaa0b90ab4f5e6465a0baf47ba /sys/kern/kern_ktrace.c | |
parent | 292ee3bd86be278e35b95da5aa6bcb21fe4720f4 (diff) | |
download | FreeBSD-src-a20667249ea3dd50ed661b39d30476958a826d67.zip FreeBSD-src-a20667249ea3dd50ed661b39d30476958a826d67.tar.gz |
If we fail to write to a vnode during a ktrace write, then we drop all
other references to that vnode as a trace vnode in other processes as well
as in any pending requests on the todo list. Thus, it is possible for a
ktrace request structure to have a NULL ktr_vp when it is destroyed in
ktr_freerequest(). We shouldn't call vrele() on the vnode in that case.
Reported by: bde
Diffstat (limited to 'sys/kern/kern_ktrace.c')
-rw-r--r-- | sys/kern/kern_ktrace.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index d38a0ce..5a40e09 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -271,9 +271,11 @@ ktr_freerequest(struct ktr_request *req) { crfree(req->ktr_cred); - mtx_lock(&Giant); - vrele(req->ktr_vp); - mtx_unlock(&Giant); + if (req->ktr_vp != NULL) { + mtx_lock(&Giant); + vrele(req->ktr_vp); + mtx_unlock(&Giant); + } mtx_lock(&ktrace_mtx); STAILQ_INSERT_HEAD(&ktr_free, req, ktr_list); mtx_unlock(&ktrace_mtx); |