| From 4b9d3e2ae51ef153cdc722f35c2fd0d7af86b800 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 17 Nov 2021 23:38:04 -0800 |
| Subject: perf report: Fix memory leaks around perf_tip() |
| |
| From: Ian Rogers <irogers@google.com> |
| |
| [ Upstream commit d9fc706108c15f8bc2d4ccccf8e50f74830fabd9 ] |
| |
| perf_tip() may allocate memory or use a literal, this means memory |
| wasn't freed if allocated. Change the API so that literals aren't used. |
| |
| At the same time add missing frees for system_path. These issues were |
| spotted using leak sanitizer. |
| |
| Signed-off-by: Ian Rogers <irogers@google.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/20211118073804.2149974-1-irogers@google.com |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/perf/builtin-report.c | 15 +++++++++------ |
| tools/perf/util/util.c | 14 +++++++------- |
| tools/perf/util/util.h | 2 +- |
| 3 files changed, 17 insertions(+), 14 deletions(-) |
| |
| diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c |
| index 5824aa24acfcc..91cab5cdfbc16 100644 |
| --- a/tools/perf/builtin-report.c |
| +++ b/tools/perf/builtin-report.c |
| @@ -610,14 +610,17 @@ static int report__browse_hists(struct report *rep) |
| int ret; |
| struct perf_session *session = rep->session; |
| struct evlist *evlist = session->evlist; |
| - const char *help = perf_tip(system_path(TIPDIR)); |
| + char *help = NULL, *path = NULL; |
| |
| - if (help == NULL) { |
| + path = system_path(TIPDIR); |
| + if (perf_tip(&help, path) || help == NULL) { |
| /* fallback for people who don't install perf ;-) */ |
| - help = perf_tip(DOCDIR); |
| - if (help == NULL) |
| - help = "Cannot load tips.txt file, please install perf!"; |
| + free(path); |
| + path = system_path(DOCDIR); |
| + if (perf_tip(&help, path) || help == NULL) |
| + help = strdup("Cannot load tips.txt file, please install perf!"); |
| } |
| + free(path); |
| |
| switch (use_browser) { |
| case 1: |
| @@ -644,7 +647,7 @@ static int report__browse_hists(struct report *rep) |
| ret = perf_evlist__tty_browse_hists(evlist, rep, help); |
| break; |
| } |
| - |
| + free(help); |
| return ret; |
| } |
| |
| diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c |
| index 37a9492edb3eb..df3c4671be72a 100644 |
| --- a/tools/perf/util/util.c |
| +++ b/tools/perf/util/util.c |
| @@ -379,32 +379,32 @@ fetch_kernel_version(unsigned int *puint, char *str, |
| return 0; |
| } |
| |
| -const char *perf_tip(const char *dirpath) |
| +int perf_tip(char **strp, const char *dirpath) |
| { |
| struct strlist *tips; |
| struct str_node *node; |
| - char *tip = NULL; |
| struct strlist_config conf = { |
| .dirname = dirpath, |
| .file_only = true, |
| }; |
| + int ret = 0; |
| |
| + *strp = NULL; |
| tips = strlist__new("tips.txt", &conf); |
| if (tips == NULL) |
| - return errno == ENOENT ? NULL : |
| - "Tip: check path of tips.txt or get more memory! ;-p"; |
| + return -errno; |
| |
| if (strlist__nr_entries(tips) == 0) |
| goto out; |
| |
| node = strlist__entry(tips, random() % strlist__nr_entries(tips)); |
| - if (asprintf(&tip, "Tip: %s", node->s) < 0) |
| - tip = (char *)"Tip: get more memory! ;-)"; |
| + if (asprintf(strp, "Tip: %s", node->s) < 0) |
| + ret = -ENOMEM; |
| |
| out: |
| strlist__delete(tips); |
| |
| - return tip; |
| + return ret; |
| } |
| |
| char *perf_exe(char *buf, int len) |
| diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h |
| index ad737052e5977..9f0d36ba77f2d 100644 |
| --- a/tools/perf/util/util.h |
| +++ b/tools/perf/util/util.h |
| @@ -39,7 +39,7 @@ int fetch_kernel_version(unsigned int *puint, |
| #define KVER_FMT "%d.%d.%d" |
| #define KVER_PARAM(x) KVER_VERSION(x), KVER_PATCHLEVEL(x), KVER_SUBLEVEL(x) |
| |
| -const char *perf_tip(const char *dirpath); |
| +int perf_tip(char **strp, const char *dirpath); |
| |
| #ifndef HAVE_SCHED_GETCPU_SUPPORT |
| int sched_getcpu(void); |
| -- |
| 2.33.0 |
| |