perf bpf: Avoid memory leak from perf_env__insert_btf
Subsystems (4)
Ian Rogers
reviewerPATCH v2 1/1 perf bpf: Avoid memory leak from perf_env__insert_btf
perf_env__insert_btf doesn't insert if a duplicate btf id is encountered and this causes a memory leak. Modify the function to return a success/error value and then free the memory if insertion didn't happen.
v2. Adds a return -1 when the insertion error occurs in
perf_env__fetch_btf. This doesn't affect anything as the result is never checked.
--- tools/perf/util/bpf-event.c | 6 +++++- tools/perf/util/env.c | 5 ++++- tools/perf/util/env.h | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-)
tools/perf/util/bpf-event.c +5 -1
@@ -119,7 +119,11 @@ static int perf_env__fetch_btf(struct perf_env *env, node->data_size = data_size;memcpy (node->data, data, data_size); -perf_env__insert_btf (env, node); +if (!perf_env__insert_btf (env, node)) { +/* Insertion failed because of a duplicate. */ +free (node); +return -1 ; + }return 0 ; }
tools/perf/util/env.c +4 -1
@@ -75,12 +75,13 @@ struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,return node; } -void perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node) +bool perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node) {struct rb_node *parent =NULL ;__u32 btf_id = btf_node->id;struct btf_node *node;struct rb_node **p; +bool ret = true;down_write (&env->bpf_progs.lock); p = &env->bpf_progs.btfs.rb_node;
@@ -94,6 +95,7 @@ void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) p = &(*p)->rb_right; }else {pr_debug ("duplicated btf %u\n" , btf_id); + ret = false; goto out; } }
@@ -103,6 +105,7 @@ void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) env->bpf_progs.btfs_cnt++; out:up_write (&env->bpf_progs.lock); +return ret; }struct btf_node *perf_env__find_btf (struct perf_env *env,__u32 btf_id)
tools/perf/util/env.h +1 -1
@@ -167,7 +167,7 @@ void perf_env__insert_bpf_prog_info(struct perf_env *env, struct bpf_prog_info_node *info_node);struct bpf_prog_info_node *perf_env__find_bpf_prog_info (struct perf_env *env,__u32 prog_id); -void perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node); +bool perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node);struct btf_node *perf_env__find_btf (struct perf_env *env,__u32 btf_id);int perf_env__numa_node (struct perf_env *env,int cpu);
Signature · 1 line
2.34.0.rc1.387.gb447b232ab-goog
Em Thu, Nov 11, 2021 at 11:45:25PM -0800, Ian Rogers escreveu:
Quoted 8 lines
perf_env__insert_btfdoesn't insert if a duplicate btf id is encountered and this causes a memory leak. Modify the function to return a success/error value and then free the memory if insertion didn't happen.v2. Adds a return -1 when the insertion error occurs in
perf_env__fetch_btf. This doesn't affect anything as the result is never checked.
Thanks, applied.
- Arnaldo
Quoted 75 lines
Fixes 3792cb2ff43b ("perf bpf: Save BTF in a rbtree in perf_env")Signed-off-by Ian Rogers <[email protected]>--- tools/perf/util/bpf-event.c | 6 +++++- tools/perf/util/env.c | 5 ++++- tools/perf/util/env.h | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-)tools/perf/util/bpf-event.c +5
-1@@ -119,7 +119,11 @@ static int perf_env__fetch_btf(struct perf_env *env, node->data_size = data_size;memcpy (node->data, data, data_size); -perf_env__insert_btf (env, node); +if (!perf_env__insert_btf (env, node)) { +/* Insertion failed because of a duplicate. */ +free (node); +return -1 ; + }return 0 ; }tools/perf/util/env.c +4
-1@@ -75,12 +75,13 @@ struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,return node; } -void perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node) +bool perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node) {struct rb_node *parent =NULL ;__u32 btf_id = btf_node->id;struct btf_node *node;struct rb_node **p; +bool ret = true;down_write (&env->bpf_progs.lock); p = &env->bpf_progs.btfs.rb_node;@@ -94,6 +95,7 @@ void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) p = &(*p)->rb_right; }else {pr_debug ("duplicated btf %u\n" , btf_id); + ret = false; goto out; } }@@ -103,6 +105,7 @@ void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) env->bpf_progs.btfs_cnt++; out:up_write (&env->bpf_progs.lock); +return ret; }struct btf_node *perf_env__find_btf (struct perf_env *env,__u32 btf_id)tools/perf/util/env.h +1
-1@@ -167,7 +167,7 @@ void perf_env__insert_bpf_prog_info(struct perf_env *env, struct bpf_prog_info_node *info_node);struct bpf_prog_info_node *perf_env__find_bpf_prog_info (struct perf_env *env,__u32 prog_id); -void perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node); +bool perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node);struct btf_node *perf_env__find_btf (struct perf_env *env,__u32 btf_id);int perf_env__numa_node (struct perf_env *env,int cpu);Signature · 1 line
2.34.0.rc1.387.gb447b232ab-goog
Signature · 1 line
- Arnaldo