| From: Kenneth Klette Jonassen <kennetkl@ifi.uio.no> |
| Date: Tue, 3 Feb 2015 17:49:18 +0100 |
| Subject: pkt_sched: fq: avoid hang when quantum 0 |
| |
| commit 3725a269815ba6dbb415feddc47da5af7d1fac58 upstream. |
| |
| Configuring fq with quantum 0 hangs the system, presumably because of a |
| non-interruptible infinite loop. Either way quantum 0 does not make sense. |
| |
| Reproduce with: |
| sudo tc qdisc add dev lo root fq quantum 0 initial_quantum 0 |
| ping 127.0.0.1 |
| |
| Signed-off-by: Kenneth Klette Jonassen <kennetkl@ifi.uio.no> |
| Acked-by: Eric Dumazet <edumazet@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| net/sched/sch_fq.c | 10 ++++++++-- |
| 1 file changed, 8 insertions(+), 2 deletions(-) |
| |
| --- a/net/sched/sch_fq.c |
| +++ b/net/sched/sch_fq.c |
| @@ -687,8 +687,14 @@ static int fq_change(struct Qdisc *sch, |
| if (tb[TCA_FQ_FLOW_PLIMIT]) |
| q->flow_plimit = nla_get_u32(tb[TCA_FQ_FLOW_PLIMIT]); |
| |
| - if (tb[TCA_FQ_QUANTUM]) |
| - q->quantum = nla_get_u32(tb[TCA_FQ_QUANTUM]); |
| + if (tb[TCA_FQ_QUANTUM]) { |
| + u32 quantum = nla_get_u32(tb[TCA_FQ_QUANTUM]); |
| + |
| + if (quantum > 0) |
| + q->quantum = quantum; |
| + else |
| + err = -EINVAL; |
| + } |
| |
| if (tb[TCA_FQ_INITIAL_QUANTUM]) |
| q->initial_quantum = nla_get_u32(tb[TCA_FQ_INITIAL_QUANTUM]); |