Skip to content

Commit 03edb70

Browse files
ZhongqiuHan-Qcomacmel
authored andcommitted
perf bpf: Fix two memory leakages when calling perf_env__insert_bpf_prog_info()
If perf_env__insert_bpf_prog_info() returns false due to a duplicate bpf prog info node insertion, the temporary info_node and info_linear memory will leak. Add a check to ensure the memory is freed if the function returns false. Fixes: d56354d ("perf tools: Save bpf_prog_info and BTF of new BPF programs") Reviewed-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Zhongqiu Han <quic_zhonhan@quicinc.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Ian Rogers <irogers@google.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@linaro.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Song Liu <song@kernel.org> Cc: Yicong Yang <yangyicong@hisilicon.com> Link: https://lore.kernel.org/r/20241205084500.823660-4-quic_zhonhan@quicinc.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
1 parent a7da6c7 commit 03edb70

File tree

3 files changed

+15
-5
lines changed

3 files changed

+15
-5
lines changed

tools/perf/util/bpf-event.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,10 @@ static int perf_event__synthesize_one_bpf_prog(struct perf_session *session,
289289
}
290290

291291
info_node->info_linear = info_linear;
292-
perf_env__insert_bpf_prog_info(env, info_node);
292+
if (!perf_env__insert_bpf_prog_info(env, info_node)) {
293+
free(info_linear);
294+
free(info_node);
295+
}
293296
info_linear = NULL;
294297

295298
/*
@@ -480,7 +483,10 @@ static void perf_env__add_bpf_info(struct perf_env *env, u32 id)
480483
info_node = malloc(sizeof(struct bpf_prog_info_node));
481484
if (info_node) {
482485
info_node->info_linear = info_linear;
483-
perf_env__insert_bpf_prog_info(env, info_node);
486+
if (!perf_env__insert_bpf_prog_info(env, info_node)) {
487+
free(info_linear);
488+
free(info_node);
489+
}
484490
} else
485491
free(info_linear);
486492

tools/perf/util/env.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,16 @@ struct perf_env perf_env;
2424
#include "bpf-utils.h"
2525
#include <bpf/libbpf.h>
2626

27-
void perf_env__insert_bpf_prog_info(struct perf_env *env,
27+
bool perf_env__insert_bpf_prog_info(struct perf_env *env,
2828
struct bpf_prog_info_node *info_node)
2929
{
30+
bool ret;
31+
3032
down_write(&env->bpf_progs.lock);
31-
__perf_env__insert_bpf_prog_info(env, info_node);
33+
ret = __perf_env__insert_bpf_prog_info(env, info_node);
3234
up_write(&env->bpf_progs.lock);
35+
36+
return ret;
3337
}
3438

3539
bool __perf_env__insert_bpf_prog_info(struct perf_env *env, struct bpf_prog_info_node *info_node)

tools/perf/util/env.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ int perf_env__nr_cpus_avail(struct perf_env *env);
178178
void perf_env__init(struct perf_env *env);
179179
bool __perf_env__insert_bpf_prog_info(struct perf_env *env,
180180
struct bpf_prog_info_node *info_node);
181-
void perf_env__insert_bpf_prog_info(struct perf_env *env,
181+
bool perf_env__insert_bpf_prog_info(struct perf_env *env,
182182
struct bpf_prog_info_node *info_node);
183183
struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,
184184
__u32 prog_id);

0 commit comments

Comments
 (0)