summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2013-12-24 07:32:06 +0000
committerkib <kib@FreeBSD.org>2013-12-24 07:32:06 +0000
commit7baf16ac14527f7b4c82b97af31a5aa6df0e958f (patch)
treeb42fd83eeaf3b273e82294492097d88d641747c5 /sys/kern
parentd30d9d8d8738307b1f1b93f8e0e57d71136e9b97 (diff)
downloadFreeBSD-src-7baf16ac14527f7b4c82b97af31a5aa6df0e958f.zip
FreeBSD-src-7baf16ac14527f7b4c82b97af31a5aa6df0e958f.tar.gz
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.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_vnops.c3
1 files changed, 3 insertions, 0 deletions
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;
OpenPOWER on IntegriCloud