]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/tc: fix stack overflow when dropping tclass or qdisc
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 12 Apr 2024 23:46:44 +0000 (08:46 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 12 Apr 2024 23:49:54 +0000 (08:49 +0900)
Fixes a bug introduced by be8e93390003e45acbb318c6e1e48fbc3c772f78 (v255).

Fixes #32247.
Fixes #32254.

src/network/tc/qdisc.c
src/network/tc/tclass.c

index 75bcbbf01d9e0a91c702f02a6cc2d32c1c16c422..55ce16600a73e9f261a34ac9aea8834cc7b2fe3d 100644 (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) {
index ab8f79ac5bf11f483cfe02f1dd5135db4a751d03..63229ec6e8df1eec44ec5c99055c19e2df32128d 100644 (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) {