diff options
Diffstat (limited to 'kernel/bpf/btf.c')
| -rw-r--r-- | kernel/bpf/btf.c | 8 | 
1 files changed, 7 insertions, 1 deletions
| diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index 7bccaa4646e5..eb12d4f705cc 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -4815,6 +4815,7 @@ static int btf_check_type_tags(struct btf_verifier_env *env,  	n = btf_nr_types(btf);  	for (i = start_id; i < n; i++) {  		const struct btf_type *t; +		int chain_limit = 32;  		u32 cur_id = i;  		t = btf_type_by_id(btf, i); @@ -4827,6 +4828,10 @@ static int btf_check_type_tags(struct btf_verifier_env *env,  		in_tags = btf_type_is_type_tag(t);  		while (btf_type_is_modifier(t)) { +			if (!chain_limit--) { +				btf_verifier_log(env, "Max chain length or cycle detected"); +				return -ELOOP; +			}  			if (btf_type_is_type_tag(t)) {  				if (!in_tags) {  					btf_verifier_log(env, "Type tags don't precede modifiers"); @@ -6054,6 +6059,7 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env,  				    struct bpf_reg_state *regs,  				    bool ptr_to_mem_ok)  { +	enum bpf_prog_type prog_type = resolve_prog_type(env->prog);  	struct bpf_verifier_log *log = &env->log;  	u32 i, nargs, ref_id, ref_obj_id = 0;  	bool is_kfunc = btf_is_kernel(btf); @@ -6171,7 +6177,7 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env,  				return -EINVAL;  			}  			/* rest of the arguments can be anything, like normal kfunc */ -		} else if (btf_get_prog_ctx_type(log, btf, t, env->prog->type, i)) { +		} else if (btf_get_prog_ctx_type(log, btf, t, prog_type, i)) {  			/* If function expects ctx type in BTF check that caller  			 * is passing PTR_TO_CTX.  			 */ | 
