Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f4572434 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Sasha Levin
Browse files

ovl: listxattr: use strnlen()



[ Upstream commit 7cb35119d067191ce9ebc380a599db0b03cbd9d9 ]

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 cc318bc6
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -263,7 +263,8 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
	struct path realpath;
	enum ovl_path_type type = ovl_path_real(dentry, &realpath);
	ssize_t res;
	int off;
	size_t len;
	char *s;

	res = vfs_listxattr(realpath.dentry, list, size);
	if (res <= 0 || size == 0)
@@ -273,17 +274,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;
		}
	}