git: 618dee602319 - stable/13 - Set file mode during zfs_write
Ryan Moeller
freqlabs at FreeBSD.org
Tue Feb 9 17:51:19 UTC 2021
The branch stable/13 has been updated by freqlabs:
URL: https://cgit.FreeBSD.org/src/commit/?id=618dee602319166c14c6e12971425d175d4630ed
commit 618dee602319166c14c6e12971425d175d4630ed
Author: Antonio Russo <aerusso at aerusso.net>
AuthorDate: 2021-02-08 17:15:05 +0000
Commit: Ryan Moeller <freqlabs at FreeBSD.org>
CommitDate: 2021-02-09 17:51:04 +0000
Set file mode during zfs_write
Apply https://github.com/openzfs/zfs/pull/11576
Direct commit from upstream openzfs. Full commit message below:
Set file mode during zfs_write
3d40b65 refactored zfs_vnops.c, which shared much code verbatim between
Linux and BSD. After a successful write, the suid/sgid bits are reset,
and the mode to be written is stored in newmode. On Linux, this was
propagated to both the in-memory inode and znode, which is then updated
with sa_update.
3d40b65 accidentally removed the initialization of newmode, which
happened to occur on the same line as the inode update (which has been
moved out of the function).
The uninitialized newmode can be saved to disk, leading to a crash on
stat() of that file, in addition to a merely incorrect file mode.
Reviewed-by: Ryan Moeller <ryan at ixsystems.com>
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Antonio Russo <aerusso at aerusso.net>
Closes #11474
Closes #11576
Obtained from: openzfs/zfs at f8ce8aed0
MFC after: 0 days
Sponsored by: iXsystems, Inc.
(cherry picked from commit e9d419a05357036ea2fd37218d853d2c713d55cc)
---
sys/contrib/openzfs/module/zfs/zfs_vnops.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/sys/contrib/openzfs/module/zfs/zfs_vnops.c b/sys/contrib/openzfs/module/zfs/zfs_vnops.c
index 3b7c52b8dd34..2dcc231b30b6 100644
--- a/sys/contrib/openzfs/module/zfs/zfs_vnops.c
+++ b/sys/contrib/openzfs/module/zfs/zfs_vnops.c
@@ -620,6 +620,7 @@ zfs_write(znode_t *zp, uio_t *uio, int ioflag, cred_t *cr)
((zp->z_mode & S_ISUID) != 0 && uid == 0)) != 0) {
uint64_t newmode;
zp->z_mode &= ~(S_ISUID | S_ISGID);
+ newmode = zp->z_mode;
(void) sa_update(zp->z_sa_hdl, SA_ZPL_MODE(zfsvfs),
(void *)&newmode, sizeof (uint64_t), tx);
}
More information about the dev-commits-src-all
mailing list