From: Miklos Szeredi Date: Thu, 1 Sep 2016 09:12:00 +0000 (+0200) Subject: ovl: listxattr: use strnlen() X-Git-Tag: v4.1.12-108.0.20170806_1300~8 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=1f458e4487f58c1b3935c7f3d088b1b70b09a4b0;p=users%2Fjedix%2Flinux-maple.git ovl: listxattr: use strnlen() 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 Cc: Orabug: 26401569 (backport upstream commit 7cb35119d067191ce9ebc380a599db0b03cbd9d9) Signed-off-by: Shan Hai Reviewed-by: Somasundaram Krishnasamy --- diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 2d80a8dca3570..f30e3887c2f4b 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -275,7 +275,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); @@ -285,17 +286,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; } }