Skip to content

Commit 195e5dc

Browse files
CIQ Kernel Automationroxanan1996
authored andcommitted
net/sched: Make cake_enqueue return NET_XMIT_CN when past buffer_limit
jira VULN-152970 cve CVE-2025-39766 commit-author William Liu <will@willsroot.io> commit 15de71d The following setup can trigger a WARNING in htb_activate due to the condition: !cl->leaf.q->q.qlen tc qdisc del dev lo root tc qdisc add dev lo root handle 1: htb default 1 tc class add dev lo parent 1: classid 1:1 \ htb rate 64bit tc qdisc add dev lo parent 1:1 handle f: \ cake memlimit 1b ping -I lo -f -c1 -s64 -W0.001 127.0.0.1 This is because the low memlimit leads to a low buffer_limit, which causes packet dropping. However, cake_enqueue still returns NET_XMIT_SUCCESS, causing htb_enqueue to call htb_activate with an empty child qdisc. We should return NET_XMIT_CN when packets are dropped from the same tin and flow. I do not believe return value of NET_XMIT_CN is necessary for packet drops in the case of ack filtering, as that is meant to optimize performance, not to signal congestion. Fixes: 046f6fd ("sched: Add Common Applications Kept Enhanced (cake) qdisc") Signed-off-by: William Liu <will@willsroot.io> Reviewed-by: Savino Dicanosa <savy@syst3mfailure.io> Acked-by: Toke Høiland-Jørgensen <toke@toke.dk> Reviewed-by: Jamal Hadi Salim <jhs@mojatatu.com> Link: https://patch.msgid.link/20250819033601.579821-1-will@willsroot.io Signed-off-by: Jakub Kicinski <kuba@kernel.org> (cherry picked from commit 15de71d) Signed-off-by: CIQ Kernel Automation <ciq_kernel_automation@ciq.com>
1 parent 4008020 commit 195e5dc

1 file changed

Lines changed: 12 additions & 2 deletions

File tree

net/sched/sch_cake.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1701,7 +1701,7 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
17011701
ktime_t now = ktime_get();
17021702
struct cake_tin_data *b;
17031703
struct cake_flow *flow;
1704-
u32 idx;
1704+
u32 idx, tin;
17051705

17061706
/* choose flow to insert into */
17071707
idx = cake_classify(sch, &b, skb, q->flow_mode, &ret);
@@ -1711,6 +1711,7 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
17111711
__qdisc_drop(skb, to_free);
17121712
return ret;
17131713
}
1714+
tin = (u32)(b - q->tins);
17141715
idx--;
17151716
flow = &b->flows[idx];
17161717

@@ -1896,13 +1897,22 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
18961897
q->buffer_max_used = q->buffer_used;
18971898

18981899
if (q->buffer_used > q->buffer_limit) {
1900+
bool same_flow = false;
18991901
u32 dropped = 0;
1902+
u32 drop_id;
19001903

19011904
while (q->buffer_used > q->buffer_limit) {
19021905
dropped++;
1903-
cake_drop(sch, to_free);
1906+
drop_id = cake_drop(sch, to_free);
1907+
1908+
if ((drop_id >> 16) == tin &&
1909+
(drop_id & 0xFFFF) == idx)
1910+
same_flow = true;
19041911
}
19051912
b->drop_overlimit += dropped;
1913+
1914+
if (same_flow)
1915+
return NET_XMIT_CN;
19061916
}
19071917
return NET_XMIT_SUCCESS;
19081918
}

0 commit comments

Comments
 (0)