diff options
author | Mateusz Guzik <mjg@FreeBSD.org> | 2020-07-29 17:04:33 +0000 |
---|---|---|
committer | Mark Johnston <markj@FreeBSD.org> | 2021-04-09 14:49:52 +0000 |
commit | df23288bc0c6d3c16287756c7f43c679fba6a0de (patch) | |
tree | d56f98ef82b96da7d89b3d87d1d3525396aad99d | |
parent | ecc571a858586e7b62cae3794c0f6250a91a483b (diff) | |
download | src-df23288bc0c6d3c16287756c7f43c679fba6a0de.tar.gz src-df23288bc0c6d3c16287756c7f43c679fba6a0de.zip |
vfs: honor error code returned by mac_vnode_check_rename_from
(cherry picked from commit fd8c6a48abe0ad2ba64b611fe044830f89b30138)
-rw-r--r-- | sys/kern/vfs_syscalls.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 64b2f5d4a18a..f07ee87fce08 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -3499,20 +3499,27 @@ again: NDINIT_ATRIGHTS(&fromnd, DELETE, LOCKPARENT | LOCKLEAF | SAVESTART | AUDITVNODE1, pathseg, old, oldfd, &cap_renameat_source_rights, td); -#else - NDINIT_ATRIGHTS(&fromnd, DELETE, WANTPARENT | SAVESTART | AUDITVNODE1, - pathseg, old, oldfd, - &cap_renameat_source_rights, td); -#endif - if ((error = namei(&fromnd)) != 0) return (error); -#ifdef MAC error = mac_vnode_check_rename_from(td->td_ucred, fromnd.ni_dvp, fromnd.ni_vp, &fromnd.ni_cnd); VOP_UNLOCK(fromnd.ni_dvp, 0); if (fromnd.ni_dvp != fromnd.ni_vp) VOP_UNLOCK(fromnd.ni_vp, 0); + if (error != 0) { + NDFREE(&fromnd, NDF_ONLY_PNBUF); + vrele(fromnd.ni_dvp); + vrele(fromnd.ni_vp); + if (fromnd.ni_startdir) + vrele(fromnd.ni_startdir); + return (error); + } +#else + NDINIT_ATRIGHTS(&fromnd, DELETE, WANTPARENT | SAVESTART | AUDITVNODE1, + pathseg, old, oldfd, + &cap_renameat_source_rights, td); + if ((error = namei(&fromnd)) != 0) + return (error); #endif fvp = fromnd.ni_vp; NDINIT_ATRIGHTS(&tond, RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | |