Commit 8b004ea2 authored by Dmitry Antipov's avatar Dmitry Antipov Committed by Wang Liang
Browse files

net: sched: fix use-after-free in taprio_change()

stable inclusion
from stable-v5.10.229
commit 8a283a19026aaae8a773fd8061263cfa315b127f
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IB2BWJ
CVE: CVE-2024-50127

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



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

[ Upstream commit f504465970aebb2467da548f7c1efbbf36d0f44b ]

In 'taprio_change()', 'admin' pointer may become dangling due to sched
switch / removal caused by 'advance_sched()', and critical section
protected by 'q->current_entry_lock' is too small to prevent from such
a scenario (which causes use-after-free detected by KASAN). Fix this
by prefer 'rcu_replace_pointer()' over 'rcu_assign_pointer()' to update
'admin' immediately before an attempt to schedule freeing.

Fixes: a3d43c0d ("taprio: Add support adding an admin schedule")
Reported-by: default avatar <syzbot+b65e0af58423fc8a73aa@syzkaller.appspotmail.com>
Closes: https://syzkaller.appspot.com/bug?extid=b65e0af58423fc8a73aa


Acked-by: default avatarVinicius Costa Gomes <vinicius.gomes@intel.com>
Signed-off-by: default avatarDmitry Antipov <dmantipov@yandex.ru>
Link: https://patch.msgid.link/20241018051339.418890-1-dmantipov@yandex.ru


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarWang Liang <wangliang74@huawei.com>
parent 0ddd395e
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1599,7 +1599,8 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,

		taprio_start_sched(sch, start, new_admin);

		rcu_assign_pointer(q->admin_sched, new_admin);
		admin = rcu_replace_pointer(q->admin_sched, new_admin,
					    lockdep_rtnl_is_held());
		if (admin)
			call_rcu(&admin->rcu, taprio_free_sched_cb);