Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Feb 2021 17:34:09 GMT
From:      Ryan Moeller <freqlabs@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: e9d419a05357 - main - Set file mode during zfs_write
Message-ID:  <202102091734.119HY9iD017702@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by freqlabs:

URL: https://cgit.FreeBSD.org/src/commit/?id=e9d419a05357036ea2fd37218d853d2c713d55cc

commit e9d419a05357036ea2fd37218d853d2c713d55cc
Author:     Antonio Russo <aerusso@aerusso.net>
AuthorDate: 2021-02-08 17:15:05 +0000
Commit:     Ryan Moeller <freqlabs@FreeBSD.org>
CommitDate: 2021-02-09 17:30:06 +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@ixsystems.com>
    Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
    Signed-off-by: Antonio Russo <aerusso@aerusso.net>
    Closes #11474
    Closes #11576
    
    Obtained from:  openzfs/zfs@f8ce8aed0
    MFC after:      0 days
    Sponsored by:   iXsystems, Inc.
---
 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);
 		}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202102091734.119HY9iD017702>