OSDN Git Service

libbpf: Fix memory leak when emitting final btf_ext
authorAndrii Nakryiko <andrii@kernel.org>
Sat, 27 Mar 2021 04:25:02 +0000 (21:25 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 30 Mar 2021 14:38:36 +0000 (07:38 -0700)
Free temporary allocated memory used to construct finalized .BTF.ext data.
Found by Coverity static analysis on libbpf's Github repo.

Fixes: 8fd27bf69b86 ("libbpf: Add BPF static linker BTF and BTF.ext support")
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Song Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/20210327042502.969745-1-andrii@kernel.org
tools/lib/bpf/linker.c

index a29d62f..46b16cb 100644 (file)
@@ -1906,8 +1906,10 @@ static int finalize_btf_ext(struct bpf_linker *linker)
                        struct dst_sec *sec = &linker->secs[i];
 
                        sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->func_info);
-                       if (sz < 0)
-                               return sz;
+                       if (sz < 0) {
+                               err = sz;
+                               goto out;
+                       }
 
                        cur += sz;
                }
@@ -1921,8 +1923,10 @@ static int finalize_btf_ext(struct bpf_linker *linker)
                        struct dst_sec *sec = &linker->secs[i];
 
                        sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->line_info);
-                       if (sz < 0)
-                               return sz;
+                       if (sz < 0) {
+                               err = sz;
+                               goto out;
+                       }
 
                        cur += sz;
                }
@@ -1936,8 +1940,10 @@ static int finalize_btf_ext(struct bpf_linker *linker)
                        struct dst_sec *sec = &linker->secs[i];
 
                        sz = emit_btf_ext_data(linker, cur, sec->sec_name, &sec->core_relo_info);
-                       if (sz < 0)
-                               return sz;
+                       if (sz < 0) {
+                               err = sz;
+                               goto out;
+                       }
 
                        cur += sz;
                }
@@ -1948,8 +1954,10 @@ static int finalize_btf_ext(struct bpf_linker *linker)
        if (err) {
                linker->btf_ext = NULL;
                pr_warn("failed to parse final .BTF.ext data: %d\n", err);
-               return err;
+               goto out;
        }
 
-       return 0;
+out:
+       free(data);
+       return err;
 }