diff options
author | J. Bruce Fields <bfields@fieldses.org> | 2007-07-17 07:04:37 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-17 13:23:07 -0400 |
commit | 4b2ca38ad6c44ed0442092a829e6e954bf3580af (patch) | |
tree | d3256d5a1e2a0276326f8abb2e6aabc3df3812da /fs/nfsd/nfs4acl.c | |
parent | 0ac68d17996eb421dde51452b89d5545ba07c6fe (diff) |
knfsd: nfsd4: fix handling of acl errrors
nfs4_acl_nfsv4_to_posix() returns an error and returns any posix acls
calculated in two caller-provided pointers. It was setting these pointers to
-errno in some error cases, resulting in nfsd4_set_nfs4_acl() calling
posix_acl_release() with a -errno as an argument.
Fix both the caller and the callee, by modifying nfsd4_set_nfs4_acl() to
stop relying on the passed-in-pointers being left as NULL in the error
case, and by modifying nfs4_acl_nfsv4_to_posix() to stop returning
garbage in those pointers.
Thanks to Alex Soule for reporting the bug.
Signed-off-by: "J. Bruce Fields" <bfields@citi.umich.edu>
Cc: Alexander Soule <soule@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.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/nfsd/nfs4acl.c b/fs/nfsd/nfs4acl.c index 4adb5ee4759b..b6ed38380ab8 100644 --- a/fs/nfsd/nfs4acl.c +++ b/fs/nfsd/nfs4acl.c | |||
@@ -737,13 +737,16 @@ int nfs4_acl_nfsv4_to_posix(struct nfs4_acl *acl, struct posix_acl **pacl, | |||
737 | *pacl = posix_state_to_acl(&effective_acl_state, flags); | 737 | *pacl = posix_state_to_acl(&effective_acl_state, flags); |
738 | if (IS_ERR(*pacl)) { | 738 | if (IS_ERR(*pacl)) { |
739 | ret = PTR_ERR(*pacl); | 739 | ret = PTR_ERR(*pacl); |
740 | *pacl = NULL; | ||
740 | goto out_dstate; | 741 | goto out_dstate; |
741 | } | 742 | } |
742 | *dpacl = posix_state_to_acl(&default_acl_state, | 743 | *dpacl = posix_state_to_acl(&default_acl_state, |
743 | flags | NFS4_ACL_TYPE_DEFAULT); | 744 | flags | NFS4_ACL_TYPE_DEFAULT); |
744 | if (IS_ERR(*dpacl)) { | 745 | if (IS_ERR(*dpacl)) { |
745 | ret = PTR_ERR(*dpacl); | 746 | ret = PTR_ERR(*dpacl); |
747 | *dpacl = NULL; | ||
746 | posix_acl_release(*pacl); | 748 | posix_acl_release(*pacl); |
749 | *pacl = NULL; | ||
747 | goto out_dstate; | 750 | goto out_dstate; |
748 | } | 751 | } |
749 | sort_pacl(*pacl); | 752 | sort_pacl(*pacl); |