lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Tue, 15 Sep 2020 09:24:42 -0300
From:   Arnaldo Carvalho de Melo <acme@...nel.org>
To:     Namhyung Kim <namhyung@...nel.org>
Cc:     Jiri Olsa <jolsa@...hat.com>, Ingo Molnar <mingo@...nel.org>,
        Peter Zijlstra <a.p.zijlstra@...llo.nl>,
        Mark Rutland <mark.rutland@....com>,
        Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
        Stephane Eranian <eranian@...gle.com>,
        LKML <linux-kernel@...r.kernel.org>,
        Andi Kleen <ak@...ux.intel.com>,
        Ian Rogers <irogers@...gle.com>
Subject: Re: [PATCH 08/11] perf metric: Free metric when it failed to resolve

Em Tue, Sep 15, 2020 at 12:18:16PM +0900, Namhyung Kim escreveu:
> The metricgroup__add_metric() can find multiple match for a metric
> group and it's possible to fail.  Also it can fail in the middle like
> in resolve_metric() even for single metric.

Thanks, applied.

- Arnaldo

> 
> In those cases, the intermediate list and ids will be leaked like:
> 
>   Direct leak of 3 byte(s) in 1 object(s) allocated from:
>     #0 0x7f4c938f40b5 in strdup (/lib/x86_64-linux-gnu/libasan.so.5+0x920b5)
>     #1 0x55f7e71c1bef in __add_metric util/metricgroup.c:683
>     #2 0x55f7e71c31d0 in add_metric util/metricgroup.c:906
>     #3 0x55f7e71c3844 in metricgroup__add_metric util/metricgroup.c:940
>     #4 0x55f7e71c488d in metricgroup__add_metric_list util/metricgroup.c:993
>     #5 0x55f7e71c488d in parse_groups util/metricgroup.c:1045
>     #6 0x55f7e71c60a4 in metricgroup__parse_groups_test util/metricgroup.c:1087
>     #7 0x55f7e71235ae in __compute_metric tests/parse-metric.c:164
>     #8 0x55f7e7124650 in compute_metric tests/parse-metric.c:196
>     #9 0x55f7e7124650 in test_recursion_fail tests/parse-metric.c:318
>     #10 0x55f7e7124650 in test__parse_metric tests/parse-metric.c:356
>     #11 0x55f7e70be09b in run_test tests/builtin-test.c:410
>     #12 0x55f7e70be09b in test_and_print tests/builtin-test.c:440
>     #13 0x55f7e70c101a in __cmd_test tests/builtin-test.c:661
>     #14 0x55f7e70c101a in cmd_test tests/builtin-test.c:807
>     #15 0x55f7e7126214 in run_builtin /home/namhyung/project/linux/tools/perf/perf.c:312
>     #16 0x55f7e6fc41a8 in handle_internal_command /home/namhyung/project/linux/tools/perf/perf.c:364
>     #17 0x55f7e6fc41a8 in run_argv /home/namhyung/project/linux/tools/perf/perf.c:408
>     #18 0x55f7e6fc41a8 in main /home/namhyung/project/linux/tools/perf/perf.c:538
>     #19 0x7f4c93492cc9 in __libc_start_main ../csu/libc-start.c:308
> 
> Acked-by: Jiri Olsa <jolsa@...hat.com>
> Fixes: 83de0b7d535de ("perf metric: Collect referenced metrics in struct metric_ref_node")
> Signed-off-by: Namhyung Kim <namhyung@...nel.org>
> ---
>  tools/perf/util/metricgroup.c | 17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
> index 53747df601fa..35bcaa8d11e9 100644
> --- a/tools/perf/util/metricgroup.c
> +++ b/tools/perf/util/metricgroup.c
> @@ -940,7 +940,7 @@ static int metricgroup__add_metric(const char *metric, bool metric_no_group,
>  
>  		ret = add_metric(&list, pe, metric_no_group, &m, NULL, &ids);
>  		if (ret)
> -			return ret;
> +			goto out;
>  
>  		/*
>  		 * Process any possible referenced metrics
> @@ -949,12 +949,14 @@ static int metricgroup__add_metric(const char *metric, bool metric_no_group,
>  		ret = resolve_metric(metric_no_group,
>  				     &list, map, &ids);
>  		if (ret)
> -			return ret;
> +			goto out;
>  	}
>  
>  	/* End of pmu events. */
> -	if (!has_match)
> -		return -EINVAL;
> +	if (!has_match) {
> +		ret = -EINVAL;
> +		goto out;
> +	}
>  
>  	list_for_each_entry(m, &list, nd) {
>  		if (events->len > 0)
> @@ -969,9 +971,14 @@ static int metricgroup__add_metric(const char *metric, bool metric_no_group,
>  		}
>  	}
>  
> +out:
> +	/*
> +	 * add to metric_list so that they can be released
> +	 * even if it's failed
> +	 */
>  	list_splice(&list, metric_list);
>  	expr_ids__exit(&ids);
> -	return 0;
> +	return ret;
>  }
>  
>  static int metricgroup__add_metric_list(const char *list, bool metric_no_group,
> -- 
> 2.28.0.618.gf4bc123cb7-goog
> 

-- 

- Arnaldo

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ