diff options
author | Eric Dumazet <[email protected]> | 2016-06-20 15:00:43 -0700 |
---|---|---|
committer | David S. Miller <[email protected]> | 2016-06-23 15:07:44 -0400 |
commit | 21de12ee5568fd1aec47890c72967abf791ac80a (patch) | |
tree | b9bd4619c5053275f78ec107d29ea38272d6cdd0 | |
parent | 817e9f2c5c262b2716f5d77020d118ad53315f3e (diff) |
netem: fix a use after free
If the packet was dropped by lower qdisc, then we must not
access it later.
Save qdisc_pkt_len(skb) in a temp variable.
Fixes: 2ccccf5fb43f ("net_sched: update hierarchical backlog too")
Signed-off-by: Eric Dumazet <[email protected]>
Cc: WANG Cong <[email protected]>
Cc: Jamal Hadi Salim <[email protected]>
Cc: Stephen Hemminger <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
-rw-r--r-- | net/sched/sch_netem.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index 205bed00dd34..178f1630a036 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -650,14 +650,14 @@ deliver: #endif if (q->qdisc) { + unsigned int pkt_len = qdisc_pkt_len(skb); int err = qdisc_enqueue(skb, q->qdisc); - if (unlikely(err != NET_XMIT_SUCCESS)) { - if (net_xmit_drop_count(err)) { - qdisc_qstats_drop(sch); - qdisc_tree_reduce_backlog(sch, 1, - qdisc_pkt_len(skb)); - } + if (err != NET_XMIT_SUCCESS && + net_xmit_drop_count(err)) { + qdisc_qstats_drop(sch); + qdisc_tree_reduce_backlog(sch, 1, + pkt_len); } goto tfifo_dequeue; } |