• Kumar Kartikeya Dwivedi's avatar
    bpf: Rework check_func_arg_reg_off · 184c9bdb
    Kumar Kartikeya Dwivedi authored
    While check_func_arg_reg_off is the place which performs generic checks
    needed by various candidates of reg->type, there is some handling for
    special cases, like ARG_PTR_TO_DYNPTR, OBJ_RELEASE, and
    ARG_PTR_TO_RINGBUF_MEM.
    
    This commit aims to streamline these special cases and instead leave
    other things up to argument type specific code to handle. The function
    will be restrictive by default, and cover all possible cases when
    OBJ_RELEASE is set, without having to update the function again (and
    missing to do that being a bug).
    
    This is done primarily for two reasons: associating back reg->type to
    its argument leaves room for the list getting out of sync when a new
    reg->type is supported by an arg_type.
    
    The other case is ARG_PTR_TO_RINGBUF_MEM. The problem there is something
    we already handle, whenever a release argument is expected, it should
    be passed as the pointer that was received from the acquire function.
    Hence zero fixed and variable offset.
    
    There is nothing special about ARG_PTR_TO_RINGBUF_MEM, where technically
    its target register type PTR_TO_MEM | MEM_RINGBUF can already be passed
    with non-zero offset to other helper functions, which makes sense.
    
    Hence, lift the arg_type_is_release check for reg->off and cover all
    possible register types, instead of duplicating the same kind of check
    twice for current OBJ_RELEASE arg_types (alloc_mem and ptr_to_btf_id).
    
    For the release argument, arg_type_is_dynptr is the special case, where
    we go to actual object being freed through the dynptr, so the offset of
    the pointer still needs to allow fixed and variable offset and
    process_dynptr_func will verify them later for the release argument case
    as well.
    
    This is not specific to ARG_PTR_TO_DYNPTR though, we will need to make
    this exception for any future object on the stack that needs to be
    released. In this sense, PTR_TO_STACK as a candidate for object on stack
    argument is a special case for release offset checks, and they need to
    be done by the helper releasing the object on stack.
    
    Since the check has been lifted above all register type checks, remove
    the duplicated check that is being done for PTR_TO_BTF_ID.
    Acked-by: default avatarJoanne Koong <joannelkoong@gmail.com>
    Acked-by: default avatarDavid Vernet <void@manifault.com>
    Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
    Link: https://lore.kernel.org/r/20221207204141.308952-5-memxor@gmail.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    184c9bdb
ringbuf.c 3.29 KB