diff options
author | Andreas Gruenbacher | 2016-09-29 17:48:43 +0200 |
---|---|---|
committer | Al Viro | 2016-10-07 20:10:44 -0400 |
commit | bf3ee71363c0b44acb62f375aea470262ac4210a (patch) | |
tree | fc1acb8831c47a2e94f6182feaca33ac0d31fe45 /fs/xattr.c | |
parent | 5d6c31910bc0713e37628dc0ce677dcb13c8ccf4 (diff) |
vfs: Check for the IOP_XATTR flag in listxattr
When an inode doesn't support xattrs, turn listxattr off as well.
(When xattrs are "turned off", the VFS still passes security xattr
operations through to security modules, which can still expose inode
security labels that way.)
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/xattr.c')
-rw-r--r-- | fs/xattr.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/fs/xattr.c b/fs/xattr.c index 54a411519127..e1ccf2be88ac 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -326,18 +326,19 @@ nolsm: EXPORT_SYMBOL_GPL(vfs_getxattr); ssize_t -vfs_listxattr(struct dentry *d, char *list, size_t size) +vfs_listxattr(struct dentry *dentry, char *list, size_t size) { + struct inode *inode = d_inode(dentry); ssize_t error; - error = security_inode_listxattr(d); + error = security_inode_listxattr(dentry); if (error) return error; - error = -EOPNOTSUPP; - if (d->d_inode->i_op->listxattr) { - error = d->d_inode->i_op->listxattr(d, list, size); + if (inode->i_op->listxattr && (inode->i_opflags & IOP_XATTR)) { + error = -EOPNOTSUPP; + error = inode->i_op->listxattr(dentry, list, size); } else { - error = security_inode_listsecurity(d->d_inode, list, size); + error = security_inode_listsecurity(inode, list, size); if (size && error > size) error = -ERANGE; } |