On Tue, 24 Jul 2018 19:13:31 -0400
Steven Rostedt <rost...@goodmis.org> wrote:

> On Tue, 24 Jul 2018 17:30:08 -0400
> Steven Rostedt <rost...@goodmis.org> wrote:
> 
> > I don't see where ->reg() would return anything but 1 on success. Maybe
> > I'm missing something. I'll look some more, but I'm thinking of changing
> > ->reg() to return zero on all success, and negative on all errors and  
> > just check those results.
> 
> Yeah, I'm going to make these changes. That is, all struct
> event_command .reg functions will return negative on error, and
> zero or positive on everything else. All the checks are going to be
> only for the negative value.
> 
> But for the bug fix itself, I believe this should do it. Masami, what
> do you think?

Hm, as far as I can see, when register_trigger() returns >= 0, it already
calls ->init the trigger_data. This means its refcount++, and in that
case, below patch will miss to free the trigger_data.
How about below for tentative fix?

        if (!ret) {
                ret = -ENOENT;
                /* We have to forcibly free the trigger_data */
                goto out_free;
        } else if (ret > 0)
                ret = 0;

Thank you,

> 
> -- Steve
> 
> diff --git a/kernel/trace/trace_events_trigger.c 
> b/kernel/trace/trace_events_trigger.c
> index d18249683682..8771a27ca60f 100644
> --- a/kernel/trace/trace_events_trigger.c
> +++ b/kernel/trace/trace_events_trigger.c
> @@ -679,6 +679,8 @@ event_trigger_callback(struct event_command *cmd_ops,
>               goto out_free;
>  
>   out_reg:
> +     /* Up the trigger_data count to make sure reg doesn't free it on 
> failure */
> +     event_trigger_init(trigger_ops, trigger_data);
>       ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file);
>       /*
>        * The above returns on success the # of functions enabled,
> @@ -687,10 +689,11 @@ event_trigger_callback(struct event_command *cmd_ops,
>        */
>       if (!ret) {
>               ret = -ENOENT;
> -             goto out_free;
> -     } else if (ret < 0)
> -             goto out_free;
> -     ret = 0;
> +     } else if (ret > 0)
> +             ret = 0;
> +
> +     /* Down the counter of trigger_data or free it if not used anymore */
> +     event_trigger_free(trigger_ops, trigger_data);
>   out:
>       return ret;
>  


-- 
Masami Hiramatsu <mhira...@kernel.org>

Reply via email to