]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
bpftool: Fix memory leak in prog_dump()
authorQuentin Monnet <quentin@isovalent.com>
Wed, 10 Nov 2021 11:46:27 +0000 (11:46 +0000)
committerPaolo Pisati <paolo.pisati@canonical.com>
Fri, 28 Jan 2022 09:59:12 +0000 (10:59 +0100)
BugLink: https://bugs.launchpad.net/bugs/1959376
[ Upstream commit ebbd7f64a3fbe9e0f235e39fc244ee9735e2a52a ]

Following the extraction of prog_dump() from do_dump(), the struct btf
allocated in prog_dump() is no longer freed on error; the struct
bpf_prog_linfo is not freed at all. Make sure we release them before
exiting the function.

Fixes: ec2025095cf6 ("bpftool: Match several programs with same tag")
Signed-off-by: Quentin Monnet <quentin@isovalent.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20211110114632.24537-2-quentin@isovalent.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
tools/bpf/bpftool/prog.c

index fe59404e87046fd5d7d08f25f583c2fa6f4637cd..f8755beb3d9eb9d0b3b4ad88a9fad25be16266b6 100644 (file)
@@ -629,8 +629,8 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,
        char func_sig[1024];
        unsigned char *buf;
        __u32 member_len;
+       int fd, err = -1;
        ssize_t n;
-       int fd;
 
        if (mode == DUMP_JITED) {
                if (info->jited_prog_len == 0 || !info->jited_prog_insns) {
@@ -669,7 +669,7 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,
                if (fd < 0) {
                        p_err("can't open file %s: %s", filepath,
                              strerror(errno));
-                       return -1;
+                       goto exit_free;
                }
 
                n = write(fd, buf, member_len);
@@ -677,7 +677,7 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,
                if (n != (ssize_t)member_len) {
                        p_err("error writing output file: %s",
                              n < 0 ? strerror(errno) : "short write");
-                       return -1;
+                       goto exit_free;
                }
 
                if (json_output)
@@ -691,7 +691,7 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,
                                                     info->netns_ino,
                                                     &disasm_opt);
                        if (!name)
-                               return -1;
+                               goto exit_free;
                }
 
                if (info->nr_jited_func_lens && info->jited_func_lens) {
@@ -786,9 +786,12 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,
                kernel_syms_destroy(&dd);
        }
 
-       btf__free(btf);
+       err = 0;
 
-       return 0;
+exit_free:
+       btf__free(btf);
+       bpf_prog_linfo__free(prog_linfo);
+       return err;
 }
 
 static int do_dump(int argc, char **argv)