On Sun, Jan 15, 2017 at 7:14 AM, Jamal Hadi Salim <j...@mojatatu.com> wrote:
> diff --git a/net/sched/act_api.c b/net/sched/act_api.c
> index 2095c83..e10456ef6f 100644
> --- a/net/sched/act_api.c
> +++ b/net/sched/act_api.c
> @@ -900,8 +900,6 @@ static int tca_action_flush(struct net *net, struct 
> nlattr *nla,
>                         goto err;
>                 }
>                 act->order = i;
> -               if (event == RTM_GETACTION)
> -                       act->tcfa_refcnt++;
>                 list_add_tail(&act->list, &actions);
>         }
>
> @@ -914,7 +912,8 @@ static int tca_action_flush(struct net *net, struct 
> nlattr *nla,
>                 return ret;
>         }
>  err:
> -       tcf_action_destroy(&actions, 0);
> +       if (event != RTM_GETACTION)
> +               tcf_action_destroy(&actions, 0);

Why this check for RTM_GETACTION? It does not make sense
at least for the error case, that is, when tcf_action_get_1() fails
in the middle of the loop, all the previous ones should be destroyed
no matter it's GETACTION or DELACTION...

Also, for the non-error case of GETACTION, they should be
destroyed too after dumping to user-space, otherwise there is no
way to use them since 'actions' is local to that function.

I thought in commit aecc5cefc389 you grab that refcnt on purpose.

Reply via email to