提交 a082c6f6 编写于 作者: M Miklos Szeredi

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: NMiklos Szeredi <mszeredi@redhat.com>
上级 f3a15685
...@@ -240,6 +240,16 @@ int ovl_xattr_get(struct dentry *dentry, const char *name, ...@@ -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) ...@@ -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 {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册