]> git.baikalelectronics.ru Git - kernel.git/commit
sch_sfb: Don't assume the skb is still around after enqueueing to child
authorToke Høiland-Jørgensen <toke@toke.dk>
Wed, 31 Aug 2022 21:52:18 +0000 (23:52 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 15 Sep 2022 10:04:55 +0000 (12:04 +0200)
commit50e2fb950d48f191dc14e0f7c6d3dd0395a5f454
treeef65ed9ea3bb77da7c268ff76f34b4ee2f7cfce1
parent47b4f394eaf9e26b4b9c28128a553bbf867e31fa
sch_sfb: Don't assume the skb is still around after enqueueing to child

[ Upstream commit 2ef1492a6e0b552e59492afd11d90a8d1682e212 ]

The sch_sfb enqueue() routine assumes the skb is still alive after it has
been enqueued into a child qdisc, using the data in the skb cb field in the
increment_qlen() routine after enqueue. However, the skb may in fact have
been freed, causing a use-after-free in this case. In particular, this
happens if sch_cake is used as a child of sfb, and the GSO splitting mode
of CAKE is enabled (in which case the skb will be split into segments and
the original skb freed).

Fix this by copying the sfb cb data to the stack before enqueueing the skb,
and using this stack copy in increment_qlen() instead of the skb pointer
itself.

Reported-by: zdi-disclosures@trendmicro.com # ZDI-CAN-18231
Fixes: e23ae3556fed ("net_sched: SFB flow scheduler")
Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/sched/sch_sfb.c