• Dave Marchevsky's avatar
    bpf: Add callback validation to kfunc verifier logic · 5d92ddc3
    Dave Marchevsky authored
    Some BPF helpers take a callback function which the helper calls. For
    each helper that takes such a callback, there's a special call to
    __check_func_call with a callback-state-setting callback that sets up
    verifier bpf_func_state for the callback's frame.
    
    kfuncs don't have any of this infrastructure yet, so let's add it in
    this patch, following existing helper pattern as much as possible. To
    validate functionality of this added plumbing, this patch adds
    callback handling for the bpf_rbtree_add kfunc and hopes to lay
    groundwork for future graph datastructure callbacks.
    
    In the "general plumbing" category we have:
    
      * check_kfunc_call doing callback verification right before clearing
        CALLER_SAVED_REGS, exactly like check_helper_call
      * recognition of func_ptr BTF types in kfunc args as
        KF_ARG_PTR_TO_CALLBACK + propagation of subprogno for this arg type
    
    In the "rbtree_add / graph datastructure-specific plumbing" category:
    
      * Since bpf_rbtree_add must be called while the spin_lock associated
        with the tree is held, don't complain when callback's func_state
        doesn't unlock it by frame exit
      * Mark rbtree_add callback's args with ref_set_non_owning
        to prevent rbtree api functions from being called in the callback.
        Semantically this makes sense, as less() takes no ownership of its
        args when determining which comes first.
    Signed-off-by: default avatarDave Marchevsky <davemarchevsky@fb.com>
    Link: https://lore.kernel.org/r/20230214004017.2534011-5-davemarchevsky@fb.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    5d92ddc3
verifier.c 517 KB