On Mon, Sep 28, 2020 at 3:14 AM Davide Caratti <dcara...@redhat.com> wrote: > > hello, > > On Fri, 2020-09-25 at 22:45 +0300, Vlad Buslov wrote: > > On Fri 25 Sep 2020 at 22:22, Cong Wang <xiyou.wangc...@gmail.com> wrote: > > > On Fri, Sep 25, 2020 at 8:24 AM Vlad Buslov <v...@buslov.dev> wrote: > > > > > + if (TC_ACT_EXT_CMP(a->tcfa_action, TC_ACT_GOTO_CHAIN) && > > > > > + !rcu_access_pointer(a->goto_chain)) { > > > > > + tcf_action_destroy_1(a, bind); > > > > > + NL_SET_ERR_MSG(extack, "can't use goto chain with NULL > > > > > chain"); > > > > > + return ERR_PTR(-EINVAL); > > > > > + } > > > > > > > > I don't think calling tcf_action_destoy_1() is enough here. Since you > > > > moved this block before assigning cookie and releasing the module, you > > > > also need to release them manually in addition to destroying the action > > > > instance. > > > > > > > > > > tcf_action_destoy_1() eventually calls free_tcf() which frees cookie and > > > tcf_action_destroy() which releases module refcnt. > > > > > > What am I missing here? > > > > > > Thanks. > > > > The memory referenced by the function local pointer "cookie" hasn't been > > assigned yet to the a->act_cookie because in your patch you moved > > goto_chain validation code before the cookie change. That means that if > > user overwrites existing action, then action old a->act_cookie will be > > freed by tcf_action_destroy_1() but new cookie that was allocated by > > nla_memdup_cookie() will leak.
Yes, good catch! > > maybe we can just delete this if (TC_ACT_EXT_CMP(...)) { ... } > statement, instead of moving it? Each TC action already does the check > for NULL "goto chains" with a_o->init() -> tcf_action_check_ctrlact(), > so this if () statement looks dead code to me _ I probably forgot to > remove it after all actions were converted to validate the control > action inside their .init() function. Good point, I think you are right, I will send a patch to remove it. Thanks!