diff options
author | Andreas Gruenbacher <agruenba@redhat.com> | 2018-09-18 00:36:36 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-10-10 08:56:05 +0200 |
commit | 23917913b67105e34a9c07ca66f1bf4d0a50451e (patch) | |
tree | fcbd2a4a394f783ecd8e078a323ef3c8ae301270 /fs | |
parent | 51da3fc5cbceab59a4b78f21f8ee799b30739b80 (diff) | |
download | linux-stable-23917913b67105e34a9c07ca66f1bf4d0a50451e.tar.gz linux-stable-23917913b67105e34a9c07ca66f1bf4d0a50451e.tar.bz2 linux-stable-23917913b67105e34a9c07ca66f1bf4d0a50451e.zip |
sysfs: Do not return POSIX ACL xattrs via listxattr
commit ffc4c92227db5699493e43eb140b4cb5904c30ff upstream.
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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs')
-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 1bee74682513..c689fd5b5679 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -949,17 +949,19 @@ ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs, int err = 0; #ifdef CONFIG_FS_POSIX_ACL - if (inode->i_acl) { - err = xattr_list_one(&buffer, &remaining_size, - XATTR_NAME_POSIX_ACL_ACCESS); - if (err) - return err; - } - if (inode->i_default_acl) { - err = xattr_list_one(&buffer, &remaining_size, - XATTR_NAME_POSIX_ACL_DEFAULT); - if (err) - return err; + if (IS_POSIXACL(inode)) { + if (inode->i_acl) { + err = xattr_list_one(&buffer, &remaining_size, + XATTR_NAME_POSIX_ACL_ACCESS); + if (err) + return err; + } + if (inode->i_default_acl) { + err = xattr_list_one(&buffer, &remaining_size, + XATTR_NAME_POSIX_ACL_DEFAULT); + if (err) + return err; + } } #endif |