network/tc: fix stack overflow when dropping tclass or qdisc

Fixes a bug introduced by be8e933900 (v255).

Fixes #32247.
Fixes #32254.
This commit is contained in:
Yu Watanabe 2024-04-13 08:46:44 +09:00
parent bffc1a28d5
commit 632d321050
2 changed files with 12 additions and 0 deletions

View file

@ -293,14 +293,20 @@ QDisc* qdisc_drop(QDisc *qdisc) {
link = ASSERT_PTR(qdisc->link);
qdisc_mark(qdisc); /* To avoid stack overflow. */
/* also drop all child classes assigned to the qdisc. */
SET_FOREACH(tclass, link->tclasses) {
if (tclass_is_marked(tclass))
continue;
if (TC_H_MAJ(tclass->classid) != qdisc->handle)
continue;
tclass_drop(tclass);
}
qdisc_unmark(qdisc);
qdisc_enter_removed(qdisc);
if (qdisc->state == 0) {

View file

@ -260,14 +260,20 @@ TClass* tclass_drop(TClass *tclass) {
link = ASSERT_PTR(tclass->link);
tclass_mark(tclass); /* To avoid stack overflow. */
/* Also drop all child qdiscs assigned to the class. */
SET_FOREACH(qdisc, link->qdiscs) {
if (qdisc_is_marked(qdisc))
continue;
if (qdisc->parent != tclass->classid)
continue;
qdisc_drop(qdisc);
}
tclass_unmark(tclass);
tclass_enter_removed(tclass);
if (tclass->state == 0) {