All of lore.kernel.org
 help / color / mirror / Atom feed
From: Namhyung Kim <namhyung@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>, Jiri Olsa <jolsa@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Stephane Eranian <eranian@google.com>,
	LKML <linux-kernel@vger.kernel.org>,
	Andi Kleen <ak@linux.intel.com>, Ian Rogers <irogers@google.com>
Subject: [PATCH 08/11] perf metric: Free metric when it failed to resolve
Date: Tue, 15 Sep 2020 12:18:16 +0900	[thread overview]
Message-ID: <20200915031819.386559-9-namhyung@kernel.org> (raw)
In-Reply-To: <20200915031819.386559-1-namhyung@kernel.org>

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.

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@redhat.com>
Fixes: 83de0b7d535de ("perf metric: Collect referenced metrics in struct metric_ref_node")
Signed-off-by: Namhyung Kim <namhyung@kernel.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


  parent reply	other threads:[~2020-09-15  3:20 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-15  3:18 [PATCHSET v2 00/11] perf tools: Fix various memory leaks Namhyung Kim
2020-09-15  3:18 ` [PATCH 01/11] perf metric: Fix some " Namhyung Kim
2020-09-15 11:58   ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 02/11] perf metric: Fix some memory leaks - part 2 Namhyung Kim
2020-09-15 11:59   ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 03/11] perf evlist: Fix cpu/thread map leak Namhyung Kim
2020-09-15  3:18 ` [PATCH 04/11] perf parse-event: Fix cpu map leaks Namhyung Kim
2020-09-15 12:18   ` Arnaldo Carvalho de Melo
2020-09-15 14:39     ` Namhyung Kim
2020-09-15 16:51       ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 05/11] perf parse-event: Fix memory leak in evsel->unit Namhyung Kim
2020-09-15 12:19   ` Arnaldo Carvalho de Melo
2020-09-15 18:59     ` Ian Rogers
2020-09-15 19:56       ` David Malcolm
2020-09-16  7:12         ` Namhyung Kim
2020-09-16 18:37           ` Ian Rogers
2020-09-15 20:03       ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 06/11] perf test: Fix memory leaks in parse-metric test Namhyung Kim
2020-09-15 12:23   ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 07/11] perf metric: Release expr_parse_ctx after testing Namhyung Kim
2020-09-15  3:18 ` Namhyung Kim [this message]
2020-09-15 12:24   ` [PATCH 08/11] perf metric: Free metric when it failed to resolve Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 09/11] perf metric: Do not free metric when " Namhyung Kim
2020-09-15  3:18 ` [PATCH 10/11] perf test: Free aliases for PMU event map aliases test Namhyung Kim
2020-09-15  7:37   ` John Garry
2020-09-15 11:57     ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 11/11] perf test: Free formats for perf pmu parse test Namhyung Kim
2020-09-15  5:15 ` [PATCHSET v2 00/11] perf tools: Fix various memory leaks Ian Rogers
2020-09-15 14:49   ` Namhyung Kim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200915031819.386559-9-namhyung@kernel.org \
    --to=namhyung@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=eranian@google.com \
    --cc=irogers@google.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.