aboutsummaryrefslogtreecommitdiffstats
path: root/fs/overlayfs/inode.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2017-09-04 12:22:54 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2017-09-04 12:22:54 -0400
commita6cbfa1e6d38c4b3ab0ce7e3aea4bb4e744f24b8 (patch)
tree8960e571a398b5d32e72bdb9c89ce965daa870ab /fs/overlayfs/inode.c
parentf5308d1b83eba20e69df5e0926ba7257c8dd9074 (diff)
parent08d6ac9ee5fedd82040bc878705981b67a116a3f (diff)
Merge branch 'next' into for-linus
Prepare input updates for 4.14 merge window.
Diffstat (limited to 'fs/overlayfs/inode.c')
-rw-r--r--fs/overlayfs/inode.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index ad9547f82da5..d613e2c41242 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -240,6 +240,16 @@ int ovl_xattr_get(struct dentry *dentry, const char *name,
240 return res; 240 return res;
241} 241}
242 242
243static bool ovl_can_list(const char *s)
244{
245 /* List all non-trusted xatts */
246 if (strncmp(s, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) != 0)
247 return true;
248
249 /* Never list trusted.overlay, list other trusted for superuser only */
250 return !ovl_is_private_xattr(s) && capable(CAP_SYS_ADMIN);
251}
252
243ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) 253ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
244{ 254{
245 struct dentry *realdentry = ovl_dentry_real(dentry); 255 struct dentry *realdentry = ovl_dentry_real(dentry);
@@ -263,7 +273,7 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
263 return -EIO; 273 return -EIO;
264 274
265 len -= slen; 275 len -= slen;
266 if (ovl_is_private_xattr(s)) { 276 if (!ovl_can_list(s)) {
267 res -= slen; 277 res -= slen;
268 memmove(s, s + slen, len); 278 memmove(s, s + slen, len);
269 } else { 279 } else {