Commit 45373274 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Pu Lehui
Browse files

Input: uinput - reject requests with unreasonable number of slots

stable inclusion
from stable-v5.10.226
commit 51fa08edd80003db700bdaa099385c5900d27f4b
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IARX6S
CVE: CVE-2024-46745

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=51fa08edd800



--------------------------------

[ Upstream commit 206f533a0a7c683982af473079c4111f4a0f9f5e ]

From: Dmitry Torokhov <dmitry.torokhov@gmail.com>

When exercising uinput interface syzkaller may try setting up device
with a really large number of slots, which causes memory allocation
failure in input_mt_init_slots(). While this allocation failure is
handled properly and request is rejected, it results in syzkaller
reports. Additionally, such request may put undue burden on the
system which will try to free a lot of memory for a bogus request.

Fix it by limiting allowed number of slots to 100. This can easily
be extended if we see devices that can track more than 100 contacts.

Reported-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Reported-by: default avatarsyzbot <syzbot+0122fa359a69694395d5@syzkaller.appspotmail.com>
Closes: https://syzkaller.appspot.com/bug?extid=0122fa359a69694395d5
Link: https://lore.kernel.org/r/Zqgi7NYEbpRsJfa2@google.com


Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarPu Lehui <pulehui@huawei.com>
parent 88c4c0b9
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -416,6 +416,20 @@ static int uinput_validate_absinfo(struct input_dev *dev, unsigned int code,
		return -EINVAL;
	}

	/*
	 * Limit number of contacts to a reasonable value (100). This
	 * ensures that we need less than 2 pages for struct input_mt
	 * (we are not using in-kernel slot assignment so not going to
	 * allocate memory for the "red" table), and we should have no
	 * trouble getting this much memory.
	 */
	if (code == ABS_MT_SLOT && max > 99) {
		printk(KERN_DEBUG
		       "%s: unreasonably large number of slots requested: %d\n",
		       UINPUT_NAME, max);
		return -EINVAL;
	}

	return 0;
}