Linux: Defer loading the object set in zfs_setattr()

We need to wait until after having done a zfs_enter() to load some
fields from the zfsvfs structure.  Otherwise a use-after-free is
possible in the face of a concurrent rollback.

Other functions in this file are careful to avoid this bug, I believe
this is the only instance.

Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Mark Johnston <markj@FreeBSD.org>
Closes #15752
This commit is contained in:
Mark Johnston 2024-01-09 10:57:29 -05:00 committed by Brian Behlendorf
parent 7bccf98a73
commit 22e4f08c30
1 changed files with 2 additions and 1 deletions

View File

@ -1853,7 +1853,7 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr, zidmap_t *mnt_ns)
{ {
struct inode *ip; struct inode *ip;
zfsvfs_t *zfsvfs = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
objset_t *os = zfsvfs->z_os; objset_t *os;
zilog_t *zilog; zilog_t *zilog;
dmu_tx_t *tx; dmu_tx_t *tx;
vattr_t oldva; vattr_t oldva;
@ -1885,6 +1885,7 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr, zidmap_t *mnt_ns)
if ((err = zfs_enter_verify_zp(zfsvfs, zp, FTAG)) != 0) if ((err = zfs_enter_verify_zp(zfsvfs, zp, FTAG)) != 0)
return (err); return (err);
ip = ZTOI(zp); ip = ZTOI(zp);
os = zfsvfs->z_os;
/* /*
* If this is a xvattr_t, then get a pointer to the structure of * If this is a xvattr_t, then get a pointer to the structure of