diff options
author | kib <kib@FreeBSD.org> | 2013-09-13 06:52:23 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2013-09-13 06:52:23 +0000 |
commit | 4c87f20f3a2332421e787b431001348090c053b1 (patch) | |
tree | 38e33eadc534435743331d425cc796ef2ff0e200 /sys/kern/vfs_vnops.c | |
parent | b3080da236407f37102bde7b1e2cd292b78aa8ab (diff) | |
download | FreeBSD-src-4c87f20f3a2332421e787b431001348090c053b1.zip FreeBSD-src-4c87f20f3a2332421e787b431001348090c053b1.tar.gz |
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)
Diffstat (limited to 'sys/kern/vfs_vnops.c')
-rw-r--r-- | sys/kern/vfs_vnops.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index c53030a..00bd998 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -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 |