aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfs4acl.c
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@citi.umich.edu>2007-02-16 04:28:28 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-02-16 11:14:01 -0500
commit7bdfa68c5e70b815e85dab0bdd9f48ec103c4002 (patch)
tree0cb4068ea5f0281a624a4d259407243407bdaa24 /fs/nfsd/nfs4acl.c
parentf534a257acfd9dae0a689be64397919907b283ba (diff)
[PATCH] knfsd: nfsd4: relax checking of ACL inheritance bits
The rfc allows us to be more permissive about the ACL inheritance bits we accept: "If the server supports a single "inherit ACE" flag that applies to both files and directories, the server may reject the request (i.e., requiring the client to set both the file and directory inheritance flags). The server may also accept the request and silently turn on the ACE4_DIRECTORY_INHERIT_ACE flag." Let's take the latter option--the ACL is a complex attribute that could be rejected for a wide variety of reasons, and the protocol gives us little ability to explain the reason for the rejection, so erroring out is a user-unfriendly last resort. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu> Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/nfsd/nfs4acl.c')
-rw-r--r--fs/nfsd/nfs4acl.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/fs/nfsd/nfs4acl.c b/fs/nfsd/nfs4acl.c
index 5d94555cdc83..785418b0b799 100644
--- a/fs/nfsd/nfs4acl.c
+++ b/fs/nfsd/nfs4acl.c
@@ -61,9 +61,11 @@
61 61
62/* flags used to simulate posix default ACLs */ 62/* flags used to simulate posix default ACLs */
63#define NFS4_INHERITANCE_FLAGS (NFS4_ACE_FILE_INHERIT_ACE \ 63#define NFS4_INHERITANCE_FLAGS (NFS4_ACE_FILE_INHERIT_ACE \
64 | NFS4_ACE_DIRECTORY_INHERIT_ACE | NFS4_ACE_INHERIT_ONLY_ACE) 64 | NFS4_ACE_DIRECTORY_INHERIT_ACE)
65 65
66#define NFS4_SUPPORTED_FLAGS (NFS4_INHERITANCE_FLAGS | NFS4_ACE_IDENTIFIER_GROUP) 66#define NFS4_SUPPORTED_FLAGS (NFS4_INHERITANCE_FLAGS \
67 | NFS4_ACE_INHERIT_ONLY_ACE \
68 | NFS4_ACE_IDENTIFIER_GROUP)
67 69
68#define MASK_EQUAL(mask1, mask2) \ 70#define MASK_EQUAL(mask1, mask2) \
69 ( ((mask1) & NFS4_ACE_MASK_ALL) == ((mask2) & NFS4_ACE_MASK_ALL) ) 71 ( ((mask1) & NFS4_ACE_MASK_ALL) == ((mask2) & NFS4_ACE_MASK_ALL) )
@@ -707,11 +709,16 @@ nfs4_acl_split(struct nfs4_acl *acl, struct nfs4_acl *dacl)
707 if (ace->flag & ~NFS4_SUPPORTED_FLAGS) 709 if (ace->flag & ~NFS4_SUPPORTED_FLAGS)
708 return -EINVAL; 710 return -EINVAL;
709 711
710 switch (ace->flag & NFS4_INHERITANCE_FLAGS) { 712 if ((ace->flag & NFS4_INHERITANCE_FLAGS) == 0) {
711 case 0:
712 /* Leave this ace in the effective acl: */ 713 /* Leave this ace in the effective acl: */
713 continue; 714 continue;
714 case NFS4_INHERITANCE_FLAGS: 715 }
716 /*
717 * Note that when only one of FILE_INHERIT or DIRECTORY_INHERIT
718 * is set, we're effectively turning on the other. That's OK,
719 * according to rfc 3530.
720 */
721 if (ace->flag & NFS4_ACE_INHERIT_ONLY_ACE) {
715 /* Add this ace to the default acl and remove it 722 /* Add this ace to the default acl and remove it
716 * from the effective acl: */ 723 * from the effective acl: */
717 error = nfs4_acl_add_ace(dacl, ace->type, ace->flag, 724 error = nfs4_acl_add_ace(dacl, ace->type, ace->flag,
@@ -721,17 +728,13 @@ nfs4_acl_split(struct nfs4_acl *acl, struct nfs4_acl *dacl)
721 list_del(h); 728 list_del(h);
722 kfree(ace); 729 kfree(ace);
723 acl->naces--; 730 acl->naces--;
724 break; 731 } else {
725 case NFS4_INHERITANCE_FLAGS & ~NFS4_ACE_INHERIT_ONLY_ACE:
726 /* Add this ace to the default, but leave it in 732 /* Add this ace to the default, but leave it in
727 * the effective acl as well: */ 733 * the effective acl as well: */
728 error = nfs4_acl_add_ace(dacl, ace->type, ace->flag, 734 error = nfs4_acl_add_ace(dacl, ace->type, ace->flag,
729 ace->access_mask, ace->whotype, ace->who); 735 ace->access_mask, ace->whotype, ace->who);
730 if (error) 736 if (error)
731 return error; 737 return error;
732 break;
733 default:
734 return -EINVAL;
735 } 738 }
736 } 739 }
737 return 0; 740 return 0;