Commit 7a173276 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Sasha Levin

ovl: listxattr: use strnlen()

[ Upstream commit 7cb35119 ]

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: default avatarMiklos Szeredi <mszeredi@redhat.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarSasha Levin <alexander.levin@verizon.com>
parent 02b7c975
...@@ -279,7 +279,8 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) ...@@ -279,7 +279,8 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
struct path realpath; struct path realpath;
enum ovl_path_type type = ovl_path_real(dentry, &realpath); enum ovl_path_type type = ovl_path_real(dentry, &realpath);
ssize_t res; ssize_t res;
int off; size_t len;
char *s;
res = vfs_listxattr(realpath.dentry, list, size); res = vfs_listxattr(realpath.dentry, list, size);
if (res <= 0 || size == 0) if (res <= 0 || size == 0)
...@@ -289,17 +290,19 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) ...@@ -289,17 +290,19 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
return res; return res;
/* filter out private xattrs */ /* filter out private xattrs */
for (off = 0; off < res;) { for (s = list, len = res; len;) {
char *s = list + off; size_t slen = strnlen(s, len) + 1;
size_t slen = strlen(s) + 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)) { if (ovl_is_private_xattr(s)) {
res -= slen; res -= slen;
memmove(s, s + slen, res - off); memmove(s, s + slen, len);
} else { } else {
off += slen; s += slen;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment