• Kumar Kartikeya Dwivedi's avatar
    libbpf: Perform map fd cleanup for gen_loader in case of error · ba05fd36
    Kumar Kartikeya Dwivedi authored
    Alexei reported a fd leak issue in gen loader (when invoked from
    bpftool) [0]. When adding ksym support, map fd allocation was moved from
    stack to loader map, however I missed closing these fds (relevant when
    cleanup label is jumped to on error). For the success case, the
    allocated fd is returned in loader ctx, hence this problem is not
    noticed.
    
    Make three changes, first MAX_USED_MAPS in MAX_FD_ARRAY_SZ instead of
    MAX_USED_PROGS, the braino was not a problem until now for this case as
    we didn't try to close map fds (otherwise use of it would have tried
    closing 32 additional fds in ksym btf fd range). Then, do a cleanup for
    all nr_maps fds in cleanup label code, so that in case of error all
    temporary map fds from bpf_gen__map_create are closed.
    
    Then, adjust the cleanup label to only generate code for the required
    number of program and map fds.  To trim code for remaining program
    fds, lay out prog_fd array in stack in the end, so that we can
    directly skip the remaining instances.  Still stack size remains same,
    since changing that would require changes in a lot of places
    (including adjustment of stack_off macro), so nr_progs_sz variable is
    only used to track required number of iterations (and jump over
    cleanup size calculated from that), stack offset calculation remains
    unaffected.
    
    The difference for test_ksyms_module.o is as follows:
    libbpf: //prog cleanup iterations: before = 34, after = 5
    libbpf: //maps cleanup iterations: before = 64, after = 2
    
    Also, move allocation of gen->fd_array offset to bpf_gen__init. Since
    offset can now be 0, and we already continue even if add_data returns 0
    in case of failure, we do not need to distinguish between 0 offset and
    failure case 0, as we rely on bpf_gen__finish to check errors. We can
    also skip check for gen->fd_array in add_*_fd functions, since
    bpf_gen__init will take care of it.
    
      [0]: https://lore.kernel.org/bpf/CAADnVQJ6jSitKSNKyxOrUzwY2qDRX0sPkJ=VLGHuCLVJ=qOt9g@mail.gmail.com
    
    Fixes: 18f4fccb ("libbpf: Update gen_loader to emit BTF_KIND_FUNC relocations")
    Reported-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20211112232022.899074-1-memxor@gmail.com
    ba05fd36
bpf_gen_internal.h 1.66 KB