In the Linux kernel, the following vulnerability has been resolved:
net/sched: fix lockdep splat in qdisctreereduce_backlog()
qdisctreereduce_backlog() is called with the qdisc lock held, not RTNL.
We must use qdisclookuprcu() instead of qdisc_lookup()
syzbot reported:
WARNING: suspicious RCU usage
net/sched/schapi.c:305 suspicious rcudereference_protected() usage!
other info that might help us debug this:
rcuscheduleractive = 2, debuglocks = 1 3 locks held by udevd/1142: #0: ffffffff87c729a0 (rcureadlock){....}-{1:2}, at: rculockacquire include/linux/rcupdate.h:306 [inline] #0: ffffffff87c729a0 (rcureadlock){....}-{1:2}, at: rcureadlock include/linux/rcupdate.h:747 [inline] #0: ffffffff87c729a0 (rcureadlock){....}-{1:2}, at: nettxaction+0x64a/0x970 net/core/dev.c:5282 #1: ffff888171861108 (&sch->q.lock){+.-.}-{2:2}, at: spinlock include/linux/spinlock.h:350 [inline] #1: ffff888171861108 (&sch->q.lock){+.-.}-{2:2}, at: nettxaction+0x754/0x970 net/core/dev.c:5297 #2: ffffffff87c729a0 (rcureadlock){....}-{1:2}, at: rculockacquire include/linux/rcupdate.h:306 [inline] #2: ffffffff87c729a0 (rcureadlock){....}-{1:2}, at: rcureadlock include/linux/rcupdate.h:747 [inline] #2: ffffffff87c729a0 (rcureadlock){....}-{1:2}, at: qdisctreereducebacklog+0x84/0x580 net/sched/schapi.c:792
stack backtrace: CPU: 1 PID: 1142 Comm: udevd Not tainted 6.1.74-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/25/2024 Call Trace: <TASK> [<ffffffff85b85f14>] _dumpstack lib/dumpstack.c:88 [inline] [<ffffffff85b85f14>] dumpstacklvl+0x1b1/0x28f lib/dumpstack.c:106 [<ffffffff85b86007>] dumpstack+0x15/0x1e lib/dumpstack.c:113 [<ffffffff81802299>] lockdeprcususpicious+0x1b9/0x260 kernel/locking/lockdep.c:6592 [<ffffffff84f0054c>] qdisclookup+0xac/0x6f0 net/sched/schapi.c:305 [<ffffffff84f037c3>] qdisctreereducebacklog+0x243/0x580 net/sched/schapi.c:811 [<ffffffff84f5b78c>] pfifotailenqueue+0x32c/0x4b0 net/sched/schfifo.c:51 [<ffffffff84fbcf63>] qdiscenqueue include/net/schgeneric.h:833 [inline] [<ffffffff84fbcf63>] netemdequeue+0xeb3/0x15d0 net/sched/schnetem.c:723 [<ffffffff84eecab9>] dequeueskb net/sched/schgeneric.c:292 [inline] [<ffffffff84eecab9>] qdiscrestart net/sched/schgeneric.c:397 [inline] [<ffffffff84eecab9>] _qdiscrun+0x249/0x1e60 net/sched/schgeneric.c:415 [<ffffffff84d7aa96>] qdiscrun+0xd6/0x260 include/net/pktsched.h:125 [<ffffffff84d85d29>] nettxaction+0x7c9/0x970 net/core/dev.c:5313 [<ffffffff85e002bd>] _dosoftirq+0x2bd/0x9bd kernel/softirq.c:616 [<ffffffff81568bca>] invokesoftirq kernel/softirq.c:447 [inline] [<ffffffff81568bca>] _irqexitrcu+0xca/0x230 kernel/softirq.c:700 [<ffffffff81568ae9>] irqexitrcu+0x9/0x20 kernel/softirq.c:712 [<ffffffff85b89f52>] sysvecapictimerinterrupt+0x42/0x90 arch/x86/kernel/apic/apic.c:1107 [<ffffffff85c00ccb>] asmsysvecapictimer_interrupt+0x1b/0x20 arch/x86/include/asm/idtentry.h:656