When opening or closing fifo, ensure that the vnode is locked

exclusively.  Filesystems are assumed to disable shared locking for
the fifo vnode locks, but some do not.

Reported and tested by:	olgeni
Discussed with:	avg
Sponsored by:   The FreeBSD Foundation
MFC after:	1 week
Approved by:	re (glebius)
This commit is contained in:
kib 2013-09-13 06:52:23 +00:00
parent b3080da236
commit 4c87f20f3a

View File

@ -267,6 +267,8 @@ vn_open_vnode(struct vnode *vp, int fmode, struct ucred *cred,
return (error);
}
}
if (vp->v_type == VFIFO && VOP_ISLOCKED(vp) != LK_EXCLUSIVE)
vn_lock(vp, LK_UPGRADE | LK_RETRY);
if ((error = VOP_OPEN(vp, fmode, cred, td, fp)) != 0)
return (error);
@ -358,7 +360,7 @@ vn_close(vp, flags, file_cred, td)
struct mount *mp;
int error, lock_flags;
if (!(flags & FWRITE) && vp->v_mount != NULL &&
if (vp->v_type != VFIFO && !(flags & FWRITE) && vp->v_mount != NULL &&
vp->v_mount->mnt_kern_flag & MNTK_EXTENDED_SHARED)
lock_flags = LK_SHARED;
else