• Daniel Borkmann's avatar
    bpf, x64: fix memleak when not converging on calls · 39f56ca9
    Daniel Borkmann authored
    The JIT logic in jit_subprogs() is as follows: for all subprogs we
    allocate a bpf_prog_alloc(), populate it (prog->is_func = 1 here),
    and pass it to bpf_int_jit_compile(). If a failure occurred during
    JIT and prog->jited is not set, then we bail out from attempting to
    JIT the whole program, and punt to the interpreter instead. In case
    JITing went successful, we fixup BPF call offsets and do another
    pass to bpf_int_jit_compile() (extra_pass is true at that point) to
    complete JITing calls. Given that requires to pass JIT context around
    addrs and jit_data from x86 JIT are freed in the extra_pass in
    bpf_int_jit_compile() when calls are involved (if not, they can
    be freed immediately). However, if in the original pass, the JIT
    image didn't converge then we leak addrs and jit_data since image
    itself is NULL, the prog->is_func is set and extra_pass is false
    in that case, meaning both will become unreachable and are never
    cleaned up, therefore we need to free as well on !image. Only x64
    JIT is affected.
    
    Fixes: 1c2a088a ("bpf: x64: add JIT support for multi-function programs")
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    39f56ca9
bpf_jit_comp.c 33.1 KB