]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
NFSD: Check acl returned from get_acl/posix_acl_from_mode
authorKinglong Mee <kinglongmee@gmail.com>
Wed, 9 Jul 2014 13:54:16 +0000 (21:54 +0800)
committerJ. Bruce Fields <bfields@redhat.com>
Fri, 11 Jul 2014 19:03:53 +0000 (15:03 -0400)
Commit 4ac7249ea5 (nfsd: use get_acl and ->set_acl)
don't check the acl returned from get_acl()/posix_acl_from_mode().

Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs2acl.c
fs/nfsd/nfs3acl.c
fs/nfsd/nfs4acl.c

index 12b023a7ab7d5292e5bf2b89a82881754058fd36..ac54ea60b3f690c1803a3abd91b38d1250a06f54 100644 (file)
@@ -54,14 +54,14 @@ static __be32 nfsacld_proc_getacl(struct svc_rqst * rqstp,
 
        if (resp->mask & (NFS_ACL|NFS_ACLCNT)) {
                acl = get_acl(inode, ACL_TYPE_ACCESS);
-               if (IS_ERR(acl)) {
-                       nfserr = nfserrno(PTR_ERR(acl));
-                       goto fail;
-               }
                if (acl == NULL) {
                        /* Solaris returns the inode's minimum ACL. */
                        acl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
                }
+               if (IS_ERR(acl)) {
+                       nfserr = nfserrno(PTR_ERR(acl));
+                       goto fail;
+               }
                resp->acl_access = acl;
        }
        if (resp->mask & (NFS_DFACL|NFS_DFACLCNT)) {
index 2a514e21dc740d93de94052c406d9aaa5d057ff0..34cbbab6abd76ff4ec08a46aec25616516fda556 100644 (file)
@@ -47,14 +47,14 @@ static __be32 nfsd3_proc_getacl(struct svc_rqst * rqstp,
 
        if (resp->mask & (NFS_ACL|NFS_ACLCNT)) {
                acl = get_acl(inode, ACL_TYPE_ACCESS);
-               if (IS_ERR(acl)) {
-                       nfserr = nfserrno(PTR_ERR(acl));
-                       goto fail;
-               }
                if (acl == NULL) {
                        /* Solaris returns the inode's minimum ACL. */
                        acl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
                }
+               if (IS_ERR(acl)) {
+                       nfserr = nfserrno(PTR_ERR(acl));
+                       goto fail;
+               }
                resp->acl_access = acl;
        }
        if (resp->mask & (NFS_DFACL|NFS_DFACLCNT)) {
index acf6974e68237be65d7b5a1f65abe973662882b1..59fd7665178146c6dc188651f8a7eca96d3489aa 100644 (file)
@@ -146,17 +146,23 @@ nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry,
        int size = 0;
 
        pacl = get_acl(inode, ACL_TYPE_ACCESS);
-       if (!pacl) {
+       if (!pacl)
                pacl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
-               if (IS_ERR(pacl))
-                       return PTR_ERR(pacl);
-       }
+
+       if (IS_ERR(pacl))
+               return PTR_ERR(pacl);
+
        /* allocate for worst case: one (deny, allow) pair each: */
        size += 2 * pacl->a_count;
 
        if (S_ISDIR(inode->i_mode)) {
                flags = NFS4_ACL_DIR;
                dpacl = get_acl(inode, ACL_TYPE_DEFAULT);
+               if (IS_ERR(dpacl)) {
+                       error = PTR_ERR(dpacl);
+                       goto rel_pacl;
+               }
+
                if (dpacl)
                        size += 2 * dpacl->a_count;
        }
@@ -173,9 +179,10 @@ nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry,
        if (dpacl)
                _posix_to_nfsv4_one(dpacl, *acl, flags | NFS4_ACL_TYPE_DEFAULT);
 
- out:
-       posix_acl_release(pacl);
+out:
        posix_acl_release(dpacl);
+rel_pacl:
+       posix_acl_release(pacl);
        return error;
 }