]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/sched: sch_qfq: do not free existing class in qfq_change_class()
authorEric Dumazet <edumazet@google.com>
Mon, 12 Jan 2026 17:56:56 +0000 (17:56 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 14 Jan 2026 03:36:56 +0000 (19:36 -0800)
Fixes qfq_change_class() error case.

cl->qdisc and cl should only be freed if a new class and qdisc
were allocated, or we risk various UAF.

Fixes: 462dbc9101ac ("pkt_sched: QFQ Plus: fair-queueing service at DRR cost")
Reported-by: syzbot+07f3f38f723c335f106d@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/netdev/6965351d.050a0220.eaf7.00c5.GAE@google.com/T/#u
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Jamal Hadi Salim <jhs@mojatatu.com>
Link: https://patch.msgid.link/20260112175656.17605-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sched/sch_qfq.c

index f4013b547438ffe1bdc8ba519971a1681df4700b..9d59090bbe934ad56ab08a59708aab375aa77cf0 100644 (file)
@@ -529,8 +529,10 @@ set_change_agg:
        return 0;
 
 destroy_class:
-       qdisc_put(cl->qdisc);
-       kfree(cl);
+       if (!existing) {
+               qdisc_put(cl->qdisc);
+               kfree(cl);
+       }
        return err;
 }