diff options
author | Miklos Szeredi <mszeredi@redhat.com> | 2016-09-01 11:12:00 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-09-15 08:20:28 +0200 |
commit | 774b544fb06318ee9e345d180102bcfc47ebe587 (patch) | |
tree | 5b445cfe70489b49411a8c3539939719fbf3f67c /fs/overlayfs | |
parent | 177b55a50dc37b13fe82596a09d77d407a26a2c2 (diff) | |
download | linux-stable-774b544fb06318ee9e345d180102bcfc47ebe587.tar.gz linux-stable-774b544fb06318ee9e345d180102bcfc47ebe587.tar.bz2 linux-stable-774b544fb06318ee9e345d180102bcfc47ebe587.zip |
ovl: listxattr: use strnlen()
commit 7cb35119d067191ce9ebc380a599db0b03cbd9d9 upstream.
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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs/overlayfs')
-rw-r--r-- | fs/overlayfs/inode.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 1ed710044ec0..ac98a71e753a 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -279,24 +279,27 @@ 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; res = vfs_listxattr(realdentry, list, size); if (res <= 0 || size == 0) 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; } } |