aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2025-03-20 18:10:56 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2025-03-28 00:32:28 +0000
commit4e923ed15e70c9256437e96cfb6636418a9d3838 (patch)
tree8ab086a311950824d3fa0a8a5a1ce9e95900d03c
parent658a4399ea56ea9531719628b546abdad9702b47 (diff)
ufs_aclcheck(): accurately dereference vp->v_mount
(cherry picked from commit 5648c1d6f3b0d8f4d67d2e6ec56dd2abcbd8fff5)
-rw-r--r--sys/ufs/ufs/ufs_acl.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/sys/ufs/ufs/ufs_acl.c b/sys/ufs/ufs/ufs_acl.c
index 49bd686a0d96..4b6cabc2ab30 100644
--- a/sys/ufs/ufs/ufs_acl.c
+++ b/sys/ufs/ufs/ufs_acl.c
@@ -609,11 +609,11 @@ ufs_setacl(struct vop_setacl_args *ap)
}
static int
-ufs_aclcheck_nfs4(struct vop_aclcheck_args *ap)
+ufs_aclcheck_nfs4(struct vop_aclcheck_args *ap, struct mount *mp)
{
int is_directory = 0;
- if ((ap->a_vp->v_mount->mnt_flag & MNT_NFS4ACLS) == 0)
+ if ((mp->mnt_flag & MNT_NFS4ACLS) == 0)
return (EINVAL);
/*
@@ -631,10 +631,9 @@ ufs_aclcheck_nfs4(struct vop_aclcheck_args *ap)
}
static int
-ufs_aclcheck_posix1e(struct vop_aclcheck_args *ap)
+ufs_aclcheck_posix1e(struct vop_aclcheck_args *ap, struct mount *mp)
{
-
- if ((ap->a_vp->v_mount->mnt_flag & MNT_ACLS) == 0)
+ if ((mp->mnt_flag & MNT_ACLS) == 0)
return (EINVAL);
/*
@@ -667,14 +666,18 @@ ufs_aclcheck_posix1e(struct vop_aclcheck_args *ap)
int
ufs_aclcheck(struct vop_aclcheck_args *ap)
{
+ struct mount *mp;
- if ((ap->a_vp->v_mount->mnt_flag & (MNT_ACLS | MNT_NFS4ACLS)) == 0)
+ mp = atomic_load_ptr(&ap->a_vp->v_mount);
+ if (mp == NULL)
+ return (EBADF);
+ if ((mp->mnt_flag & (MNT_ACLS | MNT_NFS4ACLS)) == 0)
return (EOPNOTSUPP);
if (ap->a_type == ACL_TYPE_NFS4)
- return (ufs_aclcheck_nfs4(ap));
+ return (ufs_aclcheck_nfs4(ap, mp));
- return (ufs_aclcheck_posix1e(ap));
+ return (ufs_aclcheck_posix1e(ap, mp));
}
#endif /* !UFS_ACL */