• Jiri Olsa's avatar
    libbpf: Store zero fd to fd_array for loader kfunc relocation · 10cb8622
    Jiri Olsa authored
    When moving some of the test kfuncs to bpf_testmod I hit an issue
    when some of the kfuncs that object uses are in module and some
    in vmlinux.
    
    The problem is that both vmlinux and module kfuncs get allocated
    btf_fd_idx index into fd_array, but we store to it the BTF fd value
    only for module's kfunc, not vmlinux's one because (it's zero).
    
    Then after the program is loaded we check if fd_array[btf_fd_idx] != 0
    and close the fd.
    
    When the object has kfuncs from both vmlinux and module, the fd from
    fd_array[btf_fd_idx] from previous load will be stored in there for
    vmlinux's kfunc, so we close unrelated fd (of the program we just
    loaded in my case).
    
    Fixing this by storing zero to fd_array[btf_fd_idx] for vmlinux
    kfuncs, so the we won't close stale fd.
    Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
    Link: https://lore.kernel.org/r/20230515133756.1658301-2-jolsa@kernel.orgSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    10cb8622
gen_loader.c 37.5 KB