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 <and...@kernel.org>
---
 tools/lib/bpf/linker.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/tools/lib/bpf/linker.c b/tools/lib/bpf/linker.c
index a29d62ff8041..46b16cbdcda3 100644
--- a/tools/lib/bpf/linker.c
+++ b/tools/lib/bpf/linker.c
@@ -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;
 }
-- 
2.30.2

Reply via email to