• Toke Høiland-Jørgensen's avatar
    bpf: Fix calling global functions from BPF_PROG_TYPE_EXT programs · f858c2b2
    Toke Høiland-Jørgensen authored
    The verifier allows programs to call global functions as long as their
    argument types match, using BTF to check the function arguments. One of the
    allowed argument types to such global functions is PTR_TO_CTX; however the
    check for this fails on BPF_PROG_TYPE_EXT functions because the verifier
    uses the wrong type to fetch the vmlinux BTF ID for the program context
    type. This failure is seen when an XDP program is loaded using
    libxdp (which loads it as BPF_PROG_TYPE_EXT and attaches it to a global XDP
    type program).
    
    Fix the issue by passing in the target program type instead of the
    BPF_PROG_TYPE_EXT type to bpf_prog_get_ctx() when checking function
    argument compatibility.
    
    The first Fixes tag refers to the latest commit that touched the code in
    question, while the second one points to the code that first introduced
    the global function call verification.
    
    v2:
    - Use resolve_prog_type()
    
    Fixes: 3363bd0c ("bpf: Extend kfunc with PTR_TO_CTX, PTR_TO_MEM argument support")
    Fixes: 51c39bb1 ("bpf: Introduce function-by-function verification")
    Reported-by: default avatarSimon Sundberg <simon.sundberg@kau.se>
    Signed-off-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
    Link: https://lore.kernel.org/r/20220606075253.28422-1-toke@redhat.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    f858c2b2
btf.c 200 KB