From 87071b03a6f71c73de6713e461caaf4980b8afe3 Mon Sep 17 00:00:00 2001 From: bp Date: Tue, 3 Oct 2000 04:25:53 +0000 Subject: Prevent dereference of NULL pointer when null_lock() and null_unlock() called and there is no underlying vnode. --- sys/fs/nullfs/null_vnops.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'sys/fs/nullfs/null_vnops.c') diff --git a/sys/fs/nullfs/null_vnops.c b/sys/fs/nullfs/null_vnops.c index 0b7cb96..9c15f9d 100644 --- a/sys/fs/nullfs/null_vnops.c +++ b/sys/fs/nullfs/null_vnops.c @@ -622,6 +622,8 @@ null_lock(ap) * towards decomissioning it. */ lvp = NULLVPTOLOWERVP(vp); + if (lvp == NULL) + return (lockmgr(&vp->v_lock, flags, &vp->v_interlock, p)); if (flags & LK_INTERLOCK) { simple_unlock(&vp->v_interlock); flags &= ~LK_INTERLOCK; @@ -656,6 +658,7 @@ null_unlock(ap) struct vnode *vp = ap->a_vp; int flags = ap->a_flags; struct proc *p = ap->a_p; + struct vnode *lvp; if (vp->v_vnlock != NULL) { if (flags & LK_THISLAYER) @@ -664,10 +667,13 @@ null_unlock(ap) return (lockmgr(vp->v_vnlock, flags | LK_RELEASE, &vp->v_interlock, p)); } + lvp = NULLVPTOLOWERVP(vp); + if (lvp == NULL) + return (lockmgr(&vp->v_lock, flags | LK_RELEASE, &vp->v_interlock, p)); if ((flags & LK_THISLAYER) == 0) { if (flags & LK_INTERLOCK) simple_unlock(&vp->v_interlock); - VOP_UNLOCK(NULLVPTOLOWERVP(vp), flags & ~LK_INTERLOCK, p); + VOP_UNLOCK(lvp, flags & ~LK_INTERLOCK, p); } else flags &= ~LK_THISLAYER; return (lockmgr(&vp->v_lock, flags | LK_RELEASE, &vp->v_interlock, p)); -- cgit v1.1