Skip to content

Commit

Permalink
ovl: listxattr: use strnlen()
Browse files Browse the repository at this point in the history
Be defensive about what underlying fs provides us in the returned xattr
list buffer.  If it's not properly null terminated, bail out with a warning
insead of BUG.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Cc: <stable@vger.kernel.org>
  • Loading branch information
Miklos Szeredi committed Sep 1, 2016
1 parent 0eb45fc commit 7cb3511
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions fs/overlayfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,8 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
{
struct dentry *realdentry = ovl_dentry_real(dentry);
ssize_t res;
int off;
size_t len;
char *s;
const struct cred *old_cred;

old_cred = ovl_override_creds(dentry->d_sb);
Expand All @@ -265,17 +266,19 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
return res;

/* filter out private xattrs */
for (off = 0; off < res;) {
char *s = list + off;
size_t slen = strlen(s) + 1;
for (s = list, len = res; len;) {
size_t slen = strnlen(s, len) + 1;

BUG_ON(off + slen > res);
/* underlying fs providing us with an broken xattr list? */
if (WARN_ON(slen > len))
return -EIO;

len -= slen;
if (ovl_is_private_xattr(s)) {
res -= slen;
memmove(s, s + slen, res - off);
memmove(s, s + slen, len);
} else {
off += slen;
s += slen;
}
}

Expand Down

0 comments on commit 7cb3511

Please sign in to comment.