Skip to content

Commit

Permalink
Revert change to add NULL DACL handling
Browse files Browse the repository at this point in the history
On second thought this sort of special should be handled in Samba's
VFS rather than in ZFS.
  • Loading branch information
anodos325 committed May 2, 2021
1 parent aa23646 commit 3c3976b
Showing 1 changed file with 18 additions and 54 deletions.
72 changes: 18 additions & 54 deletions module/os/linux/zfs/zpl_xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1545,33 +1545,19 @@ static int
zfsacl_to_nfsacl41i(vsecattr_t vsecp, nfsacl41i **_nacl, size_t *_acl_size)
{
nfsacl41i *nacl = NULL;
nfsace4i *nacep = NULL;
int i, error;
size_t acl_size;
ace_t *acep = NULL;
acep = (ace_t *)vsecp.vsa_aclentp;

if ((vsecp.vsa_aclcnt == 1) &&
((acep->a_type == ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE) &&
(acep->a_flags == ACE_OWNER) &&
(acep->a_access_mask == 0) &&
(acep->a_who == -1))) {
acl_size = ACES_TO_ACLSIZE(0);
nacl = kmem_alloc(acl_size, KM_SLEEP);
nacl->na41_aces.na41_aces_len = 0;
nacl->na41_flag = vsecp.vsa_aclflags;
} else {
acl_size = ACES_TO_ACLSIZE(vsecp.vsa_aclcnt);
nacl = kmem_alloc(acl_size, KM_SLEEP);
nacep = (nfsace4i *)((char *)nacl + sizeof (nfsacl41i));
nacl->na41_aces.na41_aces_len = vsecp.vsa_aclcnt;
nacl->na41_flag = vsecp.vsa_aclflags;
nacl->na41_aces.na41_aces_val = nacep;
}

acl_size = ACES_TO_ACLSIZE(vsecp.vsa_aclcnt);

nacl = kmem_alloc(acl_size, KM_SLEEP);
nacl->na41_aces.na41_aces_len = vsecp.vsa_aclcnt;
nacl->na41_flag = vsecp.vsa_aclflags;
nacl->na41_aces.na41_aces_val = nacep;

for (i = 0; i < nacl->na41_aces.na41_aces_len; i++) {
nfsace4i *nacep = &nacl->na41_aces.na41_aces_val[i];
acep = vsecp.vsa_aclentp + (i * sizeof (ace_t));
ace_t *acep = vsecp.vsa_aclentp + (i * sizeof (ace_t));
error = acep_to_nfsace4i(acep, nacep);
if (error) {
kmem_free(nacl, acl_size);
Expand All @@ -1586,14 +1572,6 @@ zfsacl_to_nfsacl41i(vsecattr_t vsecp, nfsacl41i **_nacl, size_t *_acl_size)
static int
nfsace4i_to_acep(const nfsace4i *nacep, ace_t *acep)
{
if (nacep == NULL) {
acep->a_type = ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE;
acep->a_flags = ACE_OWNER;
acep->a_access_mask = 0;
acep->a_who = -1;
return (0);
}

acep->a_type = nacep->type;
acep->a_flags = nacep->flag & NFS41_FLAGS;
acep->a_access_mask = nacep->access_mask;
Expand Down Expand Up @@ -1628,22 +1606,8 @@ nfsace4i_to_acep(const nfsace4i *nacep, ace_t *acep)
static int
nfsacl41i_to_zfsacl(const nfsacl41i *nacl, vsecattr_t *_vsecp)
{
int i, error;
int i, error = 0;
vsecattr_t vsecp;

if (nacl->na41_aces.na41_aces_len == 0) {
/*
* We have received a NULL DACL. SMB clients may do this during
* tempfile generation. We need to allow this through. Store as
* single owner ACL entry in ZFS.
*/
vsecp.vsa_aclcnt = 1;
vsecp.vsa_aclentsz = vsecp.vsa_aclcnt * sizeof (ace_t);
vsecp.vsa_mask = (VSA_ACE | VSA_ACE_ACLFLAGS);
vsecp.vsa_aclentp = kmem_alloc(vsecp.vsa_aclentsz, KM_SLEEP);
error = nfsace4i_to_acep(NULL, vsecp.vsa_aclentp);
return (error);
}
vsecp.vsa_aclcnt = nacl->na41_aces.na41_aces_len;
vsecp.vsa_aclflags = nacl->na41_flag;
vsecp.vsa_aclentsz = vsecp.vsa_aclcnt * sizeof (ace_t);
Expand All @@ -1656,7 +1620,7 @@ nfsacl41i_to_zfsacl(const nfsacl41i *nacl, vsecattr_t *_vsecp)
error = nfsace4i_to_acep(nacep, acep);
}
*_vsecp = vsecp;
return (B_TRUE);
return (error);
}

static int
Expand Down Expand Up @@ -1724,7 +1688,7 @@ __zpl_xattr_nfs41acl_get(struct inode *ip, const char *name,
}

ret = zfsacl_to_nfsacl41i(vsecp, &nacl, &acl_size);
if (!ret) {
if (ret) {
ret = -ENOMEM;
goto nfs4acl_get_out;
}
Expand Down Expand Up @@ -1758,7 +1722,7 @@ __zpl_xattr_nfs41acl_set(struct inode *ip, const char *name,
boolean_t ok;
XDR xdr = {0};
size_t acl_size = 0;
int ret, fl, naces;
int error, fl, naces;

if (ITOZSB(ip)->z_acl_type != ZFS_ACLTYPE_NFSV4)
return (-EOPNOTSUPP);
Expand Down Expand Up @@ -1801,10 +1765,10 @@ __zpl_xattr_nfs41acl_set(struct inode *ip, const char *name,
kmem_free(nacl, sizeof (nfsacl41i));
return (-ENOMEM);
}
ret = nfsacl41i_to_zfsacl(nacl, &vsecp);
if (ret) {
kmem_free(nacl, acl_size);
return (ret);
error = nfsacl41i_to_zfsacl(nacl, &vsecp);
if (error) {
kmem_free(nacl, sizeof (nfsacl41i));
return (error);
}

/* XDR_DECODE allocates memory for the array of aces */
Expand All @@ -1814,11 +1778,11 @@ __zpl_xattr_nfs41acl_set(struct inode *ip, const char *name,

crhold(cr);
fl = capable(CAP_DAC_OVERRIDE) ? ATTR_NOACLCHECK : 0;
ret = -zfs_setsecattr(ITOZ(ip), &vsecp, fl, cr);
error = -zfs_setsecattr(ITOZ(ip), &vsecp, fl, cr);
crfree(cr);

kmem_free(vsecp.vsa_aclentp, vsecp.vsa_aclentsz);
return (ret);
return (error);
}
ZPL_XATTR_SET_WRAPPER(zpl_xattr_nfs41acl_set);

Expand Down

0 comments on commit 3c3976b

Please sign in to comment.