diff options
author | bp <bp@FreeBSD.org> | 2000-10-03 04:25:53 +0000 |
---|---|---|
committer | bp <bp@FreeBSD.org> | 2000-10-03 04:25:53 +0000 |
commit | 87071b03a6f71c73de6713e461caaf4980b8afe3 (patch) | |
tree | c57b1dfe982a78234e29356690e59b35158f18ae /sys | |
parent | c1974ebb47ff831630c55cdf55959d37b234a2ee (diff) | |
download | FreeBSD-src-87071b03a6f71c73de6713e461caaf4980b8afe3.zip FreeBSD-src-87071b03a6f71c73de6713e461caaf4980b8afe3.tar.gz |
Prevent dereference of NULL pointer when null_lock() and null_unlock()
called and there is no underlying vnode.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/fs/nullfs/null_vnops.c | 8 | ||||
-rw-r--r-- | sys/miscfs/nullfs/null_vnops.c | 8 |
2 files changed, 14 insertions, 2 deletions
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)); diff --git a/sys/miscfs/nullfs/null_vnops.c b/sys/miscfs/nullfs/null_vnops.c index 0b7cb96..9c15f9d 100644 --- a/sys/miscfs/nullfs/null_vnops.c +++ b/sys/miscfs/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)); |