From 7baf16ac14527f7b4c82b97af31a5aa6df0e958f Mon Sep 17 00:00:00 2001 From: kib Date: Tue, 24 Dec 2013 07:32:06 +0000 Subject: MFC r259522: If vn_open_vnode() succeeded in opening the vnode, but subsequent advisory lock cannot be obtained, prevent double-close of the vnode in vn_close() called from the fdrop(), by resetting file' f_ops methods. --- sys/kern/vfs_vnops.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'sys/kern') diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index da4a914..ec995c7 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -313,6 +313,9 @@ vn_open_vnode(struct vnode *vp, int fmode, struct ucred *cred, vn_lock(vp, lock_flags | LK_RETRY); (void)VOP_CLOSE(vp, fmode, cred, td); vn_finished_write(mp); + /* Prevent second close from fdrop()->vn_close(). */ + if (fp != NULL) + fp->f_ops= &badfileops; return (error); } fp->f_flag |= FHASLOCK; -- cgit v1.1