• Kumar Kartikeya Dwivedi's avatar
    bpf: Fix check_func_arg_reg_off bug for graph root/node · 6785b2ed
    Kumar Kartikeya Dwivedi authored
    The commit being fixed introduced a hunk into check_func_arg_reg_off
    that bypasses reg->off == 0 enforcement when offset points to a graph
    node or root. This might possibly be done for treating bpf_rbtree_remove
    and others as KF_RELEASE and then later check correct reg->off in helper
    argument checks.
    
    But this is not the case, those helpers are already not KF_RELEASE and
    permit non-zero reg->off and verify it later to match the subobject in
    BTF type.
    
    However, this logic leads to bpf_obj_drop permitting free of register
    arguments with non-zero offset when they point to a graph root or node
    within them, which is not ok.
    
    For instance:
    
    struct foo {
    	int i;
    	int j;
    	struct bpf_rb_node node;
    };
    
    struct foo *f = bpf_obj_new(typeof(*f));
    if (!f) ...
    bpf_obj_drop(f); // OK
    bpf_obj_drop(&f->i); // still ok from verifier PoV
    bpf_obj_drop(&f->node); // Not OK, but permitted right now
    
    Fix this by dropping the whole part of code altogether.
    
    Fixes: 6a3cd331 ("bpf: Migrate release_on_unlock logic to non-owning ref semantics")
    Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
    Link: https://lore.kernel.org/r/20230822175140.1317749-2-memxor@gmail.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    6785b2ed
verifier.c 580 KB