summaryrefslogtreecommitdiffstats
path: root/sys/fs/nullfs/null_vnops.c
diff options
context:
space:
mode:
authorbp <bp@FreeBSD.org>2000-10-03 04:25:53 +0000
committerbp <bp@FreeBSD.org>2000-10-03 04:25:53 +0000
commit87071b03a6f71c73de6713e461caaf4980b8afe3 (patch)
treec57b1dfe982a78234e29356690e59b35158f18ae /sys/fs/nullfs/null_vnops.c
parentc1974ebb47ff831630c55cdf55959d37b234a2ee (diff)
downloadFreeBSD-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/fs/nullfs/null_vnops.c')
-rw-r--r--sys/fs/nullfs/null_vnops.c8
1 files changed, 7 insertions, 1 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));
OpenPOWER on IntegriCloud