aboutsummaryrefslogtreecommitdiff
path: root/sys/fs/nfs/nfs_commonacl.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fs/nfs/nfs_commonacl.c')
-rw-r--r--sys/fs/nfs/nfs_commonacl.c66
1 files changed, 39 insertions, 27 deletions
diff --git a/sys/fs/nfs/nfs_commonacl.c b/sys/fs/nfs/nfs_commonacl.c
index 55e6f89dd8ec..bba1d8821a9b 100644
--- a/sys/fs/nfs/nfs_commonacl.c
+++ b/sys/fs/nfs/nfs_commonacl.c
@@ -65,7 +65,7 @@ nfsrv_dissectace(struct nfsrv_descript *nd, struct acl_entry *acep,
goto nfsmout;
} else if (len == 0) {
/* Netapp filers return a 0 length who for nil users */
- acep->ae_tag = ACL_UNDEFINED_TAG;
+ acep->ae_tag = ACL_EVERYONE; /* Avoid panics. */
acep->ae_id = ACL_UNDEFINED_ID;
acep->ae_perm = (acl_perm_t)0;
acep->ae_entry_type = ACL_ENTRY_TYPE_DENY;
@@ -352,32 +352,7 @@ nfsrv_buildace(struct nfsrv_descript *nd, u_char *name, int namelen,
if (ace->ae_perm & ACL_SYNCHRONIZE)
acemask |= NFSV4ACE_SYNCHRONIZE;
} else {
- if (ace->ae_perm & ACL_READ_DATA)
- acemask |= NFSV4ACE_READDATA;
- if (ace->ae_perm & ACL_WRITE_DATA)
- acemask |= NFSV4ACE_WRITEDATA;
- if (ace->ae_perm & ACL_APPEND_DATA)
- acemask |= NFSV4ACE_APPENDDATA;
- if (ace->ae_perm & ACL_READ_NAMED_ATTRS)
- acemask |= NFSV4ACE_READNAMEDATTR;
- if (ace->ae_perm & ACL_WRITE_NAMED_ATTRS)
- acemask |= NFSV4ACE_WRITENAMEDATTR;
- if (ace->ae_perm & ACL_EXECUTE)
- acemask |= NFSV4ACE_EXECUTE;
- if (ace->ae_perm & ACL_READ_ATTRIBUTES)
- acemask |= NFSV4ACE_READATTRIBUTES;
- if (ace->ae_perm & ACL_WRITE_ATTRIBUTES)
- acemask |= NFSV4ACE_WRITEATTRIBUTES;
- if (ace->ae_perm & ACL_DELETE)
- acemask |= NFSV4ACE_DELETE;
- if (ace->ae_perm & ACL_READ_ACL)
- acemask |= NFSV4ACE_READACL;
- if (ace->ae_perm & ACL_WRITE_ACL)
- acemask |= NFSV4ACE_WRITEACL;
- if (ace->ae_perm & ACL_WRITE_OWNER)
- acemask |= NFSV4ACE_WRITEOWNER;
- if (ace->ae_perm & ACL_SYNCHRONIZE)
- acemask |= NFSV4ACE_SYNCHRONIZE;
+ acemask = nfs_aceperm(ace->ae_perm);
}
*tl++ = txdr_unsigned(acemask);
*tl++ = txdr_unsigned(namelen);
@@ -388,6 +363,43 @@ nfsrv_buildace(struct nfsrv_descript *nd, u_char *name, int namelen,
}
/*
+ * Convert ae_perm to NFSv4 ACL acemask4 for regular files.
+ */
+uint32_t
+nfs_aceperm(acl_perm_t ae_perm)
+{
+ uint32_t acemask = 0x0;
+
+ if (ae_perm & ACL_READ_DATA)
+ acemask |= NFSV4ACE_READDATA;
+ if (ae_perm & ACL_WRITE_DATA)
+ acemask |= NFSV4ACE_WRITEDATA;
+ if (ae_perm & ACL_APPEND_DATA)
+ acemask |= NFSV4ACE_APPENDDATA;
+ if (ae_perm & ACL_READ_NAMED_ATTRS)
+ acemask |= NFSV4ACE_READNAMEDATTR;
+ if (ae_perm & ACL_WRITE_NAMED_ATTRS)
+ acemask |= NFSV4ACE_WRITENAMEDATTR;
+ if (ae_perm & ACL_EXECUTE)
+ acemask |= NFSV4ACE_EXECUTE;
+ if (ae_perm & ACL_READ_ATTRIBUTES)
+ acemask |= NFSV4ACE_READATTRIBUTES;
+ if (ae_perm & ACL_WRITE_ATTRIBUTES)
+ acemask |= NFSV4ACE_WRITEATTRIBUTES;
+ if (ae_perm & ACL_DELETE)
+ acemask |= NFSV4ACE_DELETE;
+ if (ae_perm & ACL_READ_ACL)
+ acemask |= NFSV4ACE_READACL;
+ if (ae_perm & ACL_WRITE_ACL)
+ acemask |= NFSV4ACE_WRITEACL;
+ if (ae_perm & ACL_WRITE_OWNER)
+ acemask |= NFSV4ACE_WRITEOWNER;
+ if (ae_perm & ACL_SYNCHRONIZE)
+ acemask |= NFSV4ACE_SYNCHRONIZE;
+ return (acemask);
+}
+
+/*
* Build an NFSv4 ACL.
*/
int