| From 9c8b176b13620a2ce3b164fe2cefaee2e11bd517 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 17 Nov 2021 23:12:47 -0800 |
| Subject: perf hist: Fix memory leak of a perf_hpp_fmt |
| |
| From: Ian Rogers <irogers@google.com> |
| |
| [ Upstream commit 0ca1f534a776cc7d42f2c33da4732b74ec2790cd ] |
| |
| perf_hpp__column_unregister() removes an entry from a list but doesn't |
| free the memory causing a memory leak spotted by leak sanitizer. |
| |
| Add the free while at the same time reducing the scope of the function |
| to static. |
| |
| Signed-off-by: Ian Rogers <irogers@google.com> |
| Reviewed-by: Kajol Jain <kjain@linux.ibm.com> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: Jiri Olsa <jolsa@redhat.com> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Cc: Namhyung Kim <namhyung@kernel.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Stephane Eranian <eranian@google.com> |
| Link: http://lore.kernel.org/lkml/20211118071247.2140392-1-irogers@google.com |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/perf/ui/hist.c | 28 ++++++++++++++-------------- |
| tools/perf/util/hist.h | 1 - |
| 2 files changed, 14 insertions(+), 15 deletions(-) |
| |
| diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c |
| index c1f24d0048527..5075ecead5f3d 100644 |
| --- a/tools/perf/ui/hist.c |
| +++ b/tools/perf/ui/hist.c |
| @@ -535,6 +535,18 @@ struct perf_hpp_list perf_hpp_list = { |
| #undef __HPP_SORT_ACC_FN |
| #undef __HPP_SORT_RAW_FN |
| |
| +static void fmt_free(struct perf_hpp_fmt *fmt) |
| +{ |
| + /* |
| + * At this point fmt should be completely |
| + * unhooked, if not it's a bug. |
| + */ |
| + BUG_ON(!list_empty(&fmt->list)); |
| + BUG_ON(!list_empty(&fmt->sort_list)); |
| + |
| + if (fmt->free) |
| + fmt->free(fmt); |
| +} |
| |
| void perf_hpp__init(void) |
| { |
| @@ -598,9 +610,10 @@ void perf_hpp_list__prepend_sort_field(struct perf_hpp_list *list, |
| list_add(&format->sort_list, &list->sorts); |
| } |
| |
| -void perf_hpp__column_unregister(struct perf_hpp_fmt *format) |
| +static void perf_hpp__column_unregister(struct perf_hpp_fmt *format) |
| { |
| list_del_init(&format->list); |
| + fmt_free(format); |
| } |
| |
| void perf_hpp__cancel_cumulate(void) |
| @@ -672,19 +685,6 @@ void perf_hpp__append_sort_keys(struct perf_hpp_list *list) |
| } |
| |
| |
| -static void fmt_free(struct perf_hpp_fmt *fmt) |
| -{ |
| - /* |
| - * At this point fmt should be completely |
| - * unhooked, if not it's a bug. |
| - */ |
| - BUG_ON(!list_empty(&fmt->list)); |
| - BUG_ON(!list_empty(&fmt->sort_list)); |
| - |
| - if (fmt->free) |
| - fmt->free(fmt); |
| -} |
| - |
| void perf_hpp__reset_output_field(struct perf_hpp_list *list) |
| { |
| struct perf_hpp_fmt *fmt, *tmp; |
| diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h |
| index 96b1c13bbccc5..919f2c6c48142 100644 |
| --- a/tools/perf/util/hist.h |
| +++ b/tools/perf/util/hist.h |
| @@ -362,7 +362,6 @@ enum { |
| }; |
| |
| void perf_hpp__init(void); |
| -void perf_hpp__column_unregister(struct perf_hpp_fmt *format); |
| void perf_hpp__cancel_cumulate(void); |
| void perf_hpp__setup_output_field(struct perf_hpp_list *list); |
| void perf_hpp__reset_output_field(struct perf_hpp_list *list); |
| -- |
| 2.33.0 |
| |