| From 99fded5d391ba1bc889eeb7a524cbc12db12eff4 Mon Sep 17 00:00:00 2001 |
| From: Ian Rogers <irogers@google.com> |
| Date: Wed, 30 Oct 2019 15:34:46 -0700 |
| Subject: [PATCH] perf parse: If pmu configuration fails free terms |
| |
| commit 38f2c4226e6bc3e8c41c318242821ba5dc825aba upstream. |
| |
| Avoid a memory leak when the configuration fails. |
| |
| Signed-off-by: Ian Rogers <irogers@google.com> |
| Acked-by: Jiri Olsa <jolsa@kernel.org> |
| Cc: Adrian Hunter <adrian.hunter@intel.com> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: Alexei Starovoitov <ast@kernel.org> |
| Cc: Andi Kleen <ak@linux.intel.com> |
| Cc: Daniel Borkmann <daniel@iogearbox.net> |
| Cc: Jin Yao <yao.jin@linux.intel.com> |
| Cc: John Garry <john.garry@huawei.com> |
| Cc: Kan Liang <kan.liang@linux.intel.com> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Cc: Martin KaFai Lau <kafai@fb.com> |
| Cc: Namhyung Kim <namhyung@kernel.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Song Liu <songliubraving@fb.com> |
| Cc: Stephane Eranian <eranian@google.com> |
| Cc: Yonghong Song <yhs@fb.com> |
| Cc: bpf@vger.kernel.org |
| Cc: clang-built-linux@googlegroups.com |
| Cc: netdev@vger.kernel.org |
| Link: http://lore.kernel.org/lkml/20191030223448.12930-9-irogers@google.com |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c |
| index cf0b9b81c5aa..717422c4193c 100644 |
| --- a/tools/perf/util/parse-events.c |
| +++ b/tools/perf/util/parse-events.c |
| @@ -1344,8 +1344,15 @@ int parse_events_add_pmu(struct parse_events_state *parse_state, |
| if (get_config_terms(head_config, &config_terms)) |
| return -ENOMEM; |
| |
| - if (perf_pmu__config(pmu, &attr, head_config, parse_state->error)) |
| + if (perf_pmu__config(pmu, &attr, head_config, parse_state->error)) { |
| + struct perf_evsel_config_term *pos, *tmp; |
| + |
| + list_for_each_entry_safe(pos, tmp, &config_terms, list) { |
| + list_del_init(&pos->list); |
| + free(pos); |
| + } |
| return -EINVAL; |
| + } |
| |
| evsel = __add_event(list, &parse_state->idx, &attr, |
| get_config_name(head_config), pmu, |
| -- |
| 2.7.4 |
| |