[Patch net] net_sched: fix a use-after-free in sfq

Subsystems: networking [general], tc subsystem, the rest

STALE4117d

5 messages, 3 authors, 2015-07-16 · open the first message on its own page

[Patch net] net_sched: fix a use-after-free in sfq

From: Cong Wang <hidden>
Date: 2015-07-14 18:22:23

Fixes: 25331d6ce42b ("net: sched: implement qstat helper routines")
Cc: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Cong Wang <redacted>
Signed-off-by: Cong Wang <redacted>
---
 net/sched/sch_sfq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
index 7d14926..52f75a5 100644
--- a/net/sched/sch_sfq.c
+++ b/net/sched/sch_sfq.c
@@ -306,10 +306,10 @@ static unsigned int sfq_drop(struct Qdisc *sch)
 		len = qdisc_pkt_len(skb);
 		slot->backlog -= len;
 		sfq_dec(q, x);
-		kfree_skb(skb);
 		sch->q.qlen--;
 		qdisc_qstats_drop(sch);
 		qdisc_qstats_backlog_dec(sch, skb);
+		kfree_skb(skb);
 		return len;
 	}
 
-- 
1.8.3.1

[Patch net] fq_codel: fix return value of fq_codel_drop()

From: Cong Wang <hidden>
Date: 2015-07-14 18:22:26

The ->drop() is supposed to return the number of bytes it dropped,
however fq_codel_drop() returns the index of the flow where it drops
a packet from.

Fix this by introducing a helper to wrap fq_codel_drop().

Cc: Eric Dumazet <redacted>
Signed-off-by: Cong Wang <redacted>
Signed-off-by: Cong Wang <redacted>
---
 net/sched/sch_fq_codel.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c
index 06e7c84..21ca33c 100644
--- a/net/sched/sch_fq_codel.c
+++ b/net/sched/sch_fq_codel.c
@@ -163,6 +163,15 @@ static unsigned int fq_codel_drop(struct Qdisc *sch)
 	return idx;
 }
 
+static unsigned int fq_codel_qdisc_drop(struct Qdisc *sch)
+{
+	unsigned int prev_backlog;
+
+	prev_backlog = sch->qstats.backlog;
+	fq_codel_drop(sch);
+	return prev_backlog - sch->qstats.backlog;
+}
+
 static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch)
 {
 	struct fq_codel_sched_data *q = qdisc_priv(sch);
@@ -604,7 +613,7 @@ static struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = {
 	.enqueue	=	fq_codel_enqueue,
 	.dequeue	=	fq_codel_dequeue,
 	.peek		=	qdisc_peek_dequeued,
-	.drop		=	fq_codel_drop,
+	.drop		=	fq_codel_qdisc_drop,
 	.init		=	fq_codel_init,
 	.reset		=	fq_codel_reset,
 	.destroy	=	fq_codel_destroy,
-- 
1.8.3.1

Re: [Patch net] fq_codel: fix return value of fq_codel_drop()

From: Eric Dumazet <hidden>
Date: 2015-07-15 06:27:39

On Tue, 2015-07-14 at 11:21 -0700, Cong Wang wrote:
The ->drop() is supposed to return the number of bytes it dropped,
however fq_codel_drop() returns the index of the flow where it drops
a packet from.

Fix this by introducing a helper to wrap fq_codel_drop().

Cc: Eric Dumazet <redacted>
Signed-off-by: Cong Wang <redacted>
Signed-off-by: Cong Wang <redacted>
---
SGTM, thanks Cong.

Acked-by: Eric Dumazet <redacted>

Re: [Patch net] net_sched: fix a use-after-free in sfq

From: David Miller <davem@davemloft.net>
Date: 2015-07-16 04:36:53

From: Cong Wang <redacted>
Date: Tue, 14 Jul 2015 11:21:57 -0700
Fixes: 25331d6ce42b ("net: sched: implement qstat helper routines")
Cc: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Cong Wang <redacted>
Signed-off-by: Cong Wang <redacted>
Applied.

Re: [Patch net] fq_codel: fix return value of fq_codel_drop()

From: David Miller <davem@davemloft.net>
Date: 2015-07-16 04:36:58

From: Cong Wang <redacted>
Date: Tue, 14 Jul 2015 11:21:58 -0700
The ->drop() is supposed to return the number of bytes it dropped,
however fq_codel_drop() returns the index of the flow where it drops
a packet from.

Fix this by introducing a helper to wrap fq_codel_drop().

Cc: Eric Dumazet <redacted>
Signed-off-by: Cong Wang <redacted>
Signed-off-by: Cong Wang <redacted>
Applied.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help