Em Mon, Jun 06, 2016 at 07:52:53PM +0900, Taeung Song escreveu:
> Because of die() at perf_parse_file() a config set was freed
> in collect_config(), if failed.
> But it is natural to free a config set after collect_config() is done
> when some problems happened.
> 
> So, in case of failure, lastly free a config set at perf_config_set__new()
> instead of freeing the config set in collect_config().
> 
> Cc: Namhyung Kim <namhy...@kernel.org>
> Cc: Jiri Olsa <jo...@redhat.com>
> Cc: Masami Hiramatsu <mhira...@kernel.org>
> Cc: Alexander Shishkin <alexander.shish...@linux.intel.com>
> Signed-off-by: Taeung Song <treeze.tae...@gmail.com>
> ---
>  tools/perf/util/config.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c
> index b500737..d013f90 100644
> --- a/tools/perf/util/config.c
> +++ b/tools/perf/util/config.c
> @@ -639,7 +639,6 @@ static int collect_config(const char *var, const char 
> *value,
>  
>  out_free:
>       free(key);
> -     perf_config_set__delete(set);
>       return -1;
>  }
>  
> @@ -649,7 +648,8 @@ struct perf_config_set *perf_config_set__new(void)
>  
>       if (set) {
>               INIT_LIST_HEAD(&set->sections);
> -             perf_config(collect_config, set);
> +             if (perf_config(collect_config, set) < 0)
> +                     perf_config_set__delete(set);
>       }
>  
>       return set;

You can't do that, there is something missing, without looking at the
code I think you need:

        if (set) {
                INIT_LIST_HEAD(&set->sections);
-               perf_config(collect_config, set);
+               if (perf_config(collect_config, set) < 0) {
+                       perf_config_set__delete(set);
+                       set = NULL;
+               }
        }
 
        return set;

No?

- Arnaldo

Reply via email to