mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
ovl: filter trusted xattr for non-admin
Filesystems filter out extended attributes in the "trusted." domain for unprivlieged callers. Overlay calls underlying filesystem's method with elevated privs, so need to do the filtering in overlayfs too. Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
parent
f3a1568582
commit
a082c6f680
@ -240,6 +240,16 @@ int ovl_xattr_get(struct dentry *dentry, const char *name,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool ovl_can_list(const char *s)
|
||||||
|
{
|
||||||
|
/* List all non-trusted xatts */
|
||||||
|
if (strncmp(s, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) != 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* Never list trusted.overlay, list other trusted for superuser only */
|
||||||
|
return !ovl_is_private_xattr(s) && capable(CAP_SYS_ADMIN);
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
|
ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
|
||||||
{
|
{
|
||||||
struct dentry *realdentry = ovl_dentry_real(dentry);
|
struct dentry *realdentry = ovl_dentry_real(dentry);
|
||||||
@ -263,7 +273,7 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
len -= slen;
|
len -= slen;
|
||||||
if (ovl_is_private_xattr(s)) {
|
if (!ovl_can_list(s)) {
|
||||||
res -= slen;
|
res -= slen;
|
||||||
memmove(s, s + slen, len);
|
memmove(s, s + slen, len);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user