On 27.11.2017 18:37, Jiri Pirko wrote:
> From: Jiri Pirko <j...@mellanox.com>
> 
> q->link.block is not initialized, that leads to EINVAL when one tries to
> add filter there. So initialize it properly.
> 
> This can be reproduced by:
> $ tc qdisc add dev eth0 root handle 1: cbq avpkt 1000 rate 1000Mbit bandwidth 
> 1000Mbit
> $ tc filter add dev eth0 parent 1: protocol ip prio 100 u32 match ip protocol 
> 0 0x00 flowid 1:1
> 
> Reported-by: Jaroslav Aster <jas...@redhat.com>
> Reported-by: Ivan Vecera <ivec...@redhat.com>
> Fixes: 6529eaba33f0 ("net: sched: introduce tcf block infractructure")
> Signed-off-by: Jiri Pirko <j...@mellanox.com>
> ---
>  net/sched/sch_cbq.c | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c
> index 6361be7..525eb3a 100644
> --- a/net/sched/sch_cbq.c
> +++ b/net/sched/sch_cbq.c
> @@ -1158,9 +1158,13 @@ static int cbq_init(struct Qdisc *sch, struct nlattr 
> *opt)
>       if ((q->link.R_tab = qdisc_get_rtab(r, tb[TCA_CBQ_RTAB])) == NULL)
>               return -EINVAL;
>  
> +     err = tcf_block_get(&q->link.block, &q->link.filter_list, sch);
> +     if (err)
> +             goto put_rtab;
> +
>       err = qdisc_class_hash_init(&q->clhash);
>       if (err < 0)
> -             goto put_rtab;
> +             goto put_block;
>  
>       q->link.sibling = &q->link;
>       q->link.common.classid = sch->handle;
> @@ -1194,6 +1198,9 @@ static int cbq_init(struct Qdisc *sch, struct nlattr 
> *opt)
>       cbq_addprio(q, &q->link);
>       return 0;
>  
> +put_block:
> +     tcf_block_put(q->link.block);
> +
>  put_rtab:
>       qdisc_put_rtab(q->link.R_tab);
>       return err;
> 
Thanks for quick fix.

Reviewed-by: Ivan Vecera <ivec...@redhat.com>

Reply via email to