Patch "bpf: Set kptr_struct_meta for node param to list and rbtree insert funcs" has been added to the 6.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    bpf: Set kptr_struct_meta for node param to list and rbtree insert funcs

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     bpf-set-kptr_struct_meta-for-node-param-to-list-and-.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 40006323c7d05162bfe50ba5e8134c184e8d69fd
Author: Dave Marchevsky <davemarchevsky@xxxxxx>
Date:   Thu Jun 1 19:26:40 2023 -0700

    bpf: Set kptr_struct_meta for node param to list and rbtree insert funcs
    
    [ Upstream commit 2140a6e3422de22e6ebe77d4d18b6c0c9c425426 ]
    
    In verifier.c, fixup_kfunc_call uses struct bpf_insn_aux_data's
    kptr_struct_meta field to pass information about local kptr types to
    various helpers and kfuncs at runtime. The recent bpf_refcount series
    added a few functions to the set that need this information:
    
      * bpf_refcount_acquire
        * Needs to know where the refcount field is in order to increment
      * Graph collection insert kfuncs: bpf_rbtree_add, bpf_list_push_{front,back}
        * Were migrated to possibly fail by the bpf_refcount series. If
          insert fails, the input node is bpf_obj_drop'd. bpf_obj_drop needs
          the kptr_struct_meta in order to decr refcount and properly free
          special fields.
    
    Unfortunately the verifier handling of collection insert kfuncs was not
    modified to actually populate kptr_struct_meta. Accordingly, when the
    node input to those kfuncs is passed to bpf_obj_drop, it is done so
    without the information necessary to decr refcount.
    
    This patch fixes the issue by populating kptr_struct_meta for those
    kfuncs.
    
    Fixes: d2dcc67df910 ("bpf: Migrate bpf_rbtree_add and bpf_list_push_{front,back} to possibly fail")
    Signed-off-by: Dave Marchevsky <davemarchevsky@xxxxxx>
    Link: https://lore.kernel.org/r/20230602022647.1571784-3-davemarchevsky@xxxxxx
    Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 4b3d0ead703f4..405f29079a8cb 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -10286,6 +10286,8 @@ __process_kf_arg_ptr_to_graph_node(struct bpf_verifier_env *env,
 			node_off, btf_name_by_offset(reg->btf, t->name_off));
 		return -EINVAL;
 	}
+	meta->arg_btf = reg->btf;
+	meta->arg_btf_id = reg->btf_id;
 
 	if (node_off != field->graph_root.node_offset) {
 		verbose(env, "arg#1 offset=%d, but expected %s at offset=%d in struct %s\n",
@@ -10833,6 +10835,7 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
 	    meta.func_id == special_kfunc_list[KF_bpf_rbtree_add_impl]) {
 		release_ref_obj_id = regs[BPF_REG_2].ref_obj_id;
 		insn_aux->insert_off = regs[BPF_REG_2].off;
+		insn_aux->kptr_struct_meta = btf_find_struct_meta(meta.arg_btf, meta.arg_btf_id);
 		err = ref_convert_owning_non_owning(env, release_ref_obj_id);
 		if (err) {
 			verbose(env, "kfunc %s#%d conversion of owning ref to non-owning failed\n",



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux