summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_vnops.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2013-09-13 06:52:23 +0000
committerkib <kib@FreeBSD.org>2013-09-13 06:52:23 +0000
commit4c87f20f3a2332421e787b431001348090c053b1 (patch)
tree38e33eadc534435743331d425cc796ef2ff0e200 /sys/kern/vfs_vnops.c
parentb3080da236407f37102bde7b1e2cd292b78aa8ab (diff)
downloadFreeBSD-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.c4
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
OpenPOWER on IntegriCloud