lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 105/846] bpftool: Fix memory leak in prog_dump()
    Date
    From: Quentin Monnet <quentin@isovalent.com>

    [ 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>
    ---
    tools/bpf/bpftool/prog.c | 15 +++++++++------
    1 file changed, 9 insertions(+), 6 deletions(-)

    diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
    index fe59404e87046..f8755beb3d9eb 100644
    --- a/tools/bpf/bpftool/prog.c
    +++ b/tools/bpf/bpftool/prog.c
    @@ -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)
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-01-24 22:09    [W:4.411 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site