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

Commit e8f9c4af authored by Ferry Meng's avatar Ferry Meng Committed by Greg Kroah-Hartman
Browse files

ocfs2: strict bound check before memcmp in ocfs2_xattr_find_entry()

[ Upstream commit af77c4fc1871847b528d58b7fdafb4aa1f6a9262 ]

xattr in ocfs2 maybe 'non-indexed', which saved with additional space
requested.  It's better to check if the memory is out of bound before
memcmp, although this possibility mainly comes from crafted poisonous
images.

Link: https://lkml.kernel.org/r/20240520024024.1976129-2-joseph.qi@linux.alibaba.com


Signed-off-by: default avatarFerry Meng <mengferry@linux.alibaba.com>
Signed-off-by: default avatarJoseph Qi <joseph.qi@linux.alibaba.com>
Reported-by: default avatarlei lu <llfamsec@gmail.com>
Reviewed-by: default avatarJoseph Qi <joseph.qi@linux.alibaba.com>
Cc: Changwei Ge <gechangwei@live.cn>
Cc: Gang He <ghe@suse.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Jun Piao <piaojun@huawei.com>
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Cc: Mark Fasheh <mark@fasheh.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 60c0d361
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -1074,7 +1074,7 @@ static int ocfs2_xattr_find_entry(struct inode *inode, int name_index,
{
	struct ocfs2_xattr_entry *entry;
	size_t name_len;
	int i, cmp = 1;
	int i, name_offset, cmp = 1;

	if (name == NULL)
		return -EINVAL;
@@ -1089,10 +1089,15 @@ static int ocfs2_xattr_find_entry(struct inode *inode, int name_index,
		cmp = name_index - ocfs2_xattr_get_type(entry);
		if (!cmp)
			cmp = name_len - entry->xe_name_len;
		if (!cmp)
			cmp = memcmp(name, (xs->base +
				     le16_to_cpu(entry->xe_name_offset)),
				     name_len);
		if (!cmp) {
			name_offset = le16_to_cpu(entry->xe_name_offset);
			if ((xs->base + name_offset + name_len) > xs->end) {
				ocfs2_error(inode->i_sb,
					    "corrupted xattr entries");
				return -EFSCORRUPTED;
			}
			cmp = memcmp(name, (xs->base + name_offset), name_len);
		}
		if (cmp == 0)
			break;
		entry += 1;