diff options
author | Andreas Gruenbacher <agruenba@redhat.com> | 2018-09-18 00:36:36 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2018-09-18 07:30:48 -0400 |
commit | ffc4c92227db5699493e43eb140b4cb5904c30ff (patch) | |
tree | b77ac1265e074070094902511e74c9033de16bfb /fs/xattr.c | |
parent | 5b394b2ddf0347bef56e50c69a58773c94343ff3 (diff) |
sysfs: Do not return POSIX ACL xattrs via listxattr
Commit 786534b92f3c introduced a regression that caused listxattr to
return the POSIX ACL attribute names even though sysfs doesn't support
POSIX ACLs. This happens because simple_xattr_list checks for NULL
i_acl / i_default_acl, but inode_init_always initializes those fields
to ACL_NOT_CACHED ((void *)-1). For example:
$ getfattr -m- -d /sys
/sys: system.posix_acl_access: Operation not supported
/sys: system.posix_acl_default: Operation not supported
Fix this in simple_xattr_list by checking if the filesystem supports POSIX ACLs.
Fixes: 786534b92f3c ("tmpfs: listxattr should include POSIX ACL xattrs")
Reported-by: Marc Aurèle La France <tsi@tuyoix.net>
Tested-by: Marc Aurèle La France <tsi@tuyoix.net>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Cc: stable@vger.kernel.org # v4.5+
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/xattr.c')
-rw-r--r-- | fs/xattr.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/fs/xattr.c b/fs/xattr.c index daa732550088..0d6a6a4af861 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
@@ -948,17 +948,19 @@ ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs, | |||
948 | int err = 0; | 948 | int err = 0; |
949 | 949 | ||
950 | #ifdef CONFIG_FS_POSIX_ACL | 950 | #ifdef CONFIG_FS_POSIX_ACL |
951 | if (inode->i_acl) { | 951 | if (IS_POSIXACL(inode)) { |
952 | err = xattr_list_one(&buffer, &remaining_size, | 952 | if (inode->i_acl) { |
953 | XATTR_NAME_POSIX_ACL_ACCESS); | 953 | err = xattr_list_one(&buffer, &remaining_size, |
954 | if (err) | 954 | XATTR_NAME_POSIX_ACL_ACCESS); |
955 | return err; | 955 | if (err) |
956 | } | 956 | return err; |
957 | if (inode->i_default_acl) { | 957 | } |
958 | err = xattr_list_one(&buffer, &remaining_size, | 958 | if (inode->i_default_acl) { |
959 | XATTR_NAME_POSIX_ACL_DEFAULT); | 959 | err = xattr_list_one(&buffer, &remaining_size, |
960 | if (err) | 960 | XATTR_NAME_POSIX_ACL_DEFAULT); |
961 | return err; | 961 | if (err) |
962 | return err; | ||
963 | } | ||
962 | } | 964 | } |
963 | #endif | 965 | #endif |
964 | 966 | ||