Commit 0965d85
sch_htb: make htb_deactivate() idempotent
commit 3769478 upstream.
Alan reported a NULL pointer dereference in htb_next_rb_node()
after we made htb_qlen_notify() idempotent.
It turns out in the following case it introduced some regression:
htb_dequeue_tree():
|-> fq_codel_dequeue()
|-> qdisc_tree_reduce_backlog()
|-> htb_qlen_notify()
|-> htb_deactivate()
|-> htb_next_rb_node()
|-> htb_deactivate()
For htb_next_rb_node(), after calling the 1st htb_deactivate(), the
clprio[prio]->ptr could be already set to NULL, which means
htb_next_rb_node() is vulnerable here.
For htb_deactivate(), although we checked qlen before calling it, in
case of qlen==0 after qdisc_tree_reduce_backlog(), we may call it again
which triggers the warning inside.
To fix the issues here, we need to:
1) Make htb_deactivate() idempotent, that is, simply return if we
already call it before.
2) Make htb_next_rb_node() safe against ptr==NULL.
Many thanks to Alan for testing and for the reproducer.
Fixes: 5ba8b83 ("sch_htb: make htb_qlen_notify() idempotent")
Reported-by: Alan J. Wylie <alan@wylie.me.uk>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Link: https://patch.msgid.link/20250428232955.1740419-2-xiyou.wangcong@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
[mheyne: fixed contextual conflicts]
Signed-off-by: Maximilian Heyne <mheyne@amazon.de>1 parent 526fc9d commit 0965d85
1 file changed
+6
-9
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
334 | 334 | | |
335 | 335 | | |
336 | 336 | | |
337 | | - | |
| 337 | + | |
| 338 | + | |
338 | 339 | | |
339 | 340 | | |
340 | 341 | | |
| |||
570 | 571 | | |
571 | 572 | | |
572 | 573 | | |
573 | | - | |
574 | | - | |
| 574 | + | |
| 575 | + | |
575 | 576 | | |
576 | 577 | | |
577 | 578 | | |
| |||
1190 | 1191 | | |
1191 | 1192 | | |
1192 | 1193 | | |
1193 | | - | |
1194 | | - | |
1195 | 1194 | | |
1196 | 1195 | | |
1197 | 1196 | | |
| |||
1304 | 1303 | | |
1305 | 1304 | | |
1306 | 1305 | | |
1307 | | - | |
1308 | | - | |
| 1306 | + | |
1309 | 1307 | | |
1310 | 1308 | | |
1311 | 1309 | | |
| |||
1430 | 1428 | | |
1431 | 1429 | | |
1432 | 1430 | | |
1433 | | - | |
1434 | | - | |
| 1431 | + | |
1435 | 1432 | | |
1436 | 1433 | | |
1437 | 1434 | | |
| |||
0 commit comments