diff options
author | Tsutomu Itoh <t-itoh@jp.fujitsu.com> | 2011-10-06 00:37:08 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2011-10-20 12:10:47 -0400 |
commit | cfbffc39ac89dbd5197cbeec2599a1128eb928f8 (patch) | |
tree | d544e0c12f565b1f8ff359eca3847fc0e10006c9 /fs/btrfs | |
parent | 10b2f34d6e7fbe07f498cb2006272e9a561f5e60 (diff) |
Btrfs: fix return value of btrfs_get_acl()
In btrfs_get_acl(), when the second __btrfs_getxattr() call fails,
acl is not correctly set.
Therefore, a wrong value might return to the caller.
Signed-off-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/acl.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c index eb159aaa5a11..89b156d85d63 100644 --- a/fs/btrfs/acl.c +++ b/fs/btrfs/acl.c | |||
@@ -59,22 +59,19 @@ struct posix_acl *btrfs_get_acl(struct inode *inode, int type) | |||
59 | if (!value) | 59 | if (!value) |
60 | return ERR_PTR(-ENOMEM); | 60 | return ERR_PTR(-ENOMEM); |
61 | size = __btrfs_getxattr(inode, name, value, size); | 61 | size = __btrfs_getxattr(inode, name, value, size); |
62 | if (size > 0) { | 62 | } |
63 | acl = posix_acl_from_xattr(value, size); | 63 | if (size > 0) { |
64 | if (IS_ERR(acl)) { | 64 | acl = posix_acl_from_xattr(value, size); |
65 | kfree(value); | ||
66 | return acl; | ||
67 | } | ||
68 | set_cached_acl(inode, type, acl); | ||
69 | } | ||
70 | kfree(value); | ||
71 | } else if (size == -ENOENT || size == -ENODATA || size == 0) { | 65 | } else if (size == -ENOENT || size == -ENODATA || size == 0) { |
72 | /* FIXME, who returns -ENOENT? I think nobody */ | 66 | /* FIXME, who returns -ENOENT? I think nobody */ |
73 | acl = NULL; | 67 | acl = NULL; |
74 | set_cached_acl(inode, type, acl); | ||
75 | } else { | 68 | } else { |
76 | acl = ERR_PTR(-EIO); | 69 | acl = ERR_PTR(-EIO); |
77 | } | 70 | } |
71 | kfree(value); | ||
72 | |||
73 | if (!IS_ERR(acl)) | ||
74 | set_cached_acl(inode, type, acl); | ||
78 | 75 | ||
79 | return acl; | 76 | return acl; |
80 | } | 77 | } |