diff options
author | kib <kib@FreeBSD.org> | 2013-12-24 07:32:06 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2013-12-24 07:32:06 +0000 |
commit | 7baf16ac14527f7b4c82b97af31a5aa6df0e958f (patch) | |
tree | b42fd83eeaf3b273e82294492097d88d641747c5 /sys/kern | |
parent | d30d9d8d8738307b1f1b93f8e0e57d71136e9b97 (diff) | |
download | FreeBSD-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.c | 3 |
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; |