All of lore.kernel.org
 help / color / mirror / Atom feed
* kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
@ 2021-08-28 21:42 kernel test robot
  2021-08-29  7:30 ` kernel test robot
  0 siblings, 1 reply; 5+ messages in thread
From: kernel test robot @ 2021-08-28 21:42 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 16471 bytes --]

CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Dmitrii Banshchikov <me@ubique.spb.ru>
CC: Alexei Starovoitov <ast@kernel.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   64b4fc45bea6f4faa843d2f97ff51665280efee1
commit: 523a4cf491b3c9e2d546040d57250f1a0ca84f03 bpf: Use MAX_BPF_FUNC_REG_ARGS macro
date:   6 months ago
:::::: branch date: 23 hours ago
:::::: commit date: 6 months ago
compiler: s390-linux-gcc (GCC) 11.2.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

   kernel/bpf/btf.c:5723:13: warning: Boolean result is used in bitwise operation. Clarify expression with parentheses. [clarifyCondition]
    if (!uname ^ !uname_len)
               ^
>> kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
    args = (const struct btf_param *)(t + 1);
                                        ^
   kernel/bpf/btf.c:4600:14: note: Assuming that condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is not redundant
    nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
                ^
   kernel/bpf/btf.c:4596:38: note: Null pointer addition
    args = (const struct btf_param *)(t + 1);
                                        ^

vim +4596 kernel/bpf/btf.c

84ad7a7ab69f11 Jiri Olsa              2020-01-23  4576  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4577  bool btf_ctx_access(int off, int size, enum bpf_access_type type,
9e15db66136a14 Alexei Starovoitov     2019-10-15  4578  		    const struct bpf_prog *prog,
9e15db66136a14 Alexei Starovoitov     2019-10-15  4579  		    struct bpf_insn_access_aux *info)
9e15db66136a14 Alexei Starovoitov     2019-10-15  4580  {
38207291604401 Martin KaFai Lau       2019-10-24  4581  	const struct btf_type *t = prog->aux->attach_func_proto;
3aac1ead5eb6b7 Toke Høiland-Jørgensen 2020-09-29  4582  	struct bpf_prog *tgt_prog = prog->aux->dst_prog;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4583  	struct btf *btf = bpf_prog_get_target_btf(prog);
38207291604401 Martin KaFai Lau       2019-10-24  4584  	const char *tname = prog->aux->attach_func_name;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4585  	struct bpf_verifier_log *log = info->log;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4586  	const struct btf_param *args;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4587  	u32 nr_args, arg;
3c32cc1bceba8a Yonghong Song          2020-05-13  4588  	int i, ret;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4589  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4590  	if (off % 8) {
38207291604401 Martin KaFai Lau       2019-10-24  4591  		bpf_log(log, "func '%s' offset %d is not multiple of 8\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4592  			tname, off);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4593  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4594  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4595  	arg = off / 8;
9e15db66136a14 Alexei Starovoitov     2019-10-15 @4596  	args = (const struct btf_param *)(t + 1);
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4597  	/* if (t == NULL) Fall back to default BPF prog with
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4598  	 * MAX_BPF_FUNC_REG_ARGS u64 arguments.
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4599  	 */
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4600  	nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
38207291604401 Martin KaFai Lau       2019-10-24  4601  	if (prog->aux->attach_btf_trace) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4602  		/* skip first 'void *__data' argument in btf_trace_##name typedef */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4603  		args++;
38207291604401 Martin KaFai Lau       2019-10-24  4604  		nr_args--;
38207291604401 Martin KaFai Lau       2019-10-24  4605  	}
fec56f5890d93f Alexei Starovoitov     2019-11-14  4606  
f50b49a0bfcaf5 KP Singh               2020-03-30  4607  	if (arg > nr_args) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4608  		bpf_log(log, "func '%s' doesn't have %d-th argument\n",
f50b49a0bfcaf5 KP Singh               2020-03-30  4609  			tname, arg + 1);
f50b49a0bfcaf5 KP Singh               2020-03-30  4610  		return false;
f50b49a0bfcaf5 KP Singh               2020-03-30  4611  	}
f50b49a0bfcaf5 KP Singh               2020-03-30  4612  
6ba43b761c4134 KP Singh               2020-03-04  4613  	if (arg == nr_args) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4614  		switch (prog->expected_attach_type) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4615  		case BPF_LSM_MAC:
f50b49a0bfcaf5 KP Singh               2020-03-30  4616  		case BPF_TRACE_FEXIT:
9e4e01dfd3254c KP Singh               2020-03-29  4617  			/* When LSM programs are attached to void LSM hooks
9e4e01dfd3254c KP Singh               2020-03-29  4618  			 * they use FEXIT trampolines and when attached to
9e4e01dfd3254c KP Singh               2020-03-29  4619  			 * int LSM hooks, they use MODIFY_RETURN trampolines.
9e4e01dfd3254c KP Singh               2020-03-29  4620  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4621  			 * While the LSM programs are BPF_MODIFY_RETURN-like
9e4e01dfd3254c KP Singh               2020-03-29  4622  			 * the check:
9e4e01dfd3254c KP Singh               2020-03-29  4623  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4624  			 *	if (ret_type != 'int')
9e4e01dfd3254c KP Singh               2020-03-29  4625  			 *		return -EINVAL;
9e4e01dfd3254c KP Singh               2020-03-29  4626  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4627  			 * is _not_ done here. This is still safe as LSM hooks
9e4e01dfd3254c KP Singh               2020-03-29  4628  			 * have only void and int return types.
9e4e01dfd3254c KP Singh               2020-03-29  4629  			 */
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4630  			if (!t)
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4631  				return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4632  			t = btf_type_by_id(btf, t->type);
f50b49a0bfcaf5 KP Singh               2020-03-30  4633  			break;
f50b49a0bfcaf5 KP Singh               2020-03-30  4634  		case BPF_MODIFY_RETURN:
6ba43b761c4134 KP Singh               2020-03-04  4635  			/* For now the BPF_MODIFY_RETURN can only be attached to
6ba43b761c4134 KP Singh               2020-03-04  4636  			 * functions that return an int.
6ba43b761c4134 KP Singh               2020-03-04  4637  			 */
6ba43b761c4134 KP Singh               2020-03-04  4638  			if (!t)
6ba43b761c4134 KP Singh               2020-03-04  4639  				return false;
6ba43b761c4134 KP Singh               2020-03-04  4640  
6ba43b761c4134 KP Singh               2020-03-04  4641  			t = btf_type_skip_modifiers(btf, t->type, NULL);
a9b59159d338d4 John Fastabend         2020-06-24  4642  			if (!btf_type_is_small_int(t)) {
6ba43b761c4134 KP Singh               2020-03-04  4643  				bpf_log(log,
6ba43b761c4134 KP Singh               2020-03-04  4644  					"ret type %s not allowed for fmod_ret\n",
6ba43b761c4134 KP Singh               2020-03-04  4645  					btf_kind_str[BTF_INFO_KIND(t->info)]);
6ba43b761c4134 KP Singh               2020-03-04  4646  				return false;
6ba43b761c4134 KP Singh               2020-03-04  4647  			}
f50b49a0bfcaf5 KP Singh               2020-03-30  4648  			break;
f50b49a0bfcaf5 KP Singh               2020-03-30  4649  		default:
38207291604401 Martin KaFai Lau       2019-10-24  4650  			bpf_log(log, "func '%s' doesn't have %d-th argument\n",
fec56f5890d93f Alexei Starovoitov     2019-11-14  4651  				tname, arg + 1);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4652  			return false;
f50b49a0bfcaf5 KP Singh               2020-03-30  4653  		}
fec56f5890d93f Alexei Starovoitov     2019-11-14  4654  	} else {
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4655  		if (!t)
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4656  			/* Default prog with MAX_BPF_FUNC_REG_ARGS args */
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4657  			return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4658  		t = btf_type_by_id(btf, args[arg].type);
fec56f5890d93f Alexei Starovoitov     2019-11-14  4659  	}
f50b49a0bfcaf5 KP Singh               2020-03-30  4660  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4661  	/* skip modifiers */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4662  	while (btf_type_is_modifier(t))
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4663  		t = btf_type_by_id(btf, t->type);
a9b59159d338d4 John Fastabend         2020-06-24  4664  	if (btf_type_is_small_int(t) || btf_type_is_enum(t))
9e15db66136a14 Alexei Starovoitov     2019-10-15  4665  		/* accessing a scalar */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4666  		return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4667  	if (!btf_type_is_ptr(t)) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4668  		bpf_log(log,
38207291604401 Martin KaFai Lau       2019-10-24  4669  			"func '%s' arg%d '%s' has type %s. Only pointer access is allowed\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4670  			tname, arg,
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4671  			__btf_name_by_offset(btf, t->name_off),
9e15db66136a14 Alexei Starovoitov     2019-10-15  4672  			btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4673  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4674  	}
afbf21dce668ef Yonghong Song          2020-07-23  4675  
afbf21dce668ef Yonghong Song          2020-07-23  4676  	/* check for PTR_TO_RDONLY_BUF_OR_NULL or PTR_TO_RDWR_BUF_OR_NULL */
afbf21dce668ef Yonghong Song          2020-07-23  4677  	for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
afbf21dce668ef Yonghong Song          2020-07-23  4678  		const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
afbf21dce668ef Yonghong Song          2020-07-23  4679  
afbf21dce668ef Yonghong Song          2020-07-23  4680  		if (ctx_arg_info->offset == off &&
afbf21dce668ef Yonghong Song          2020-07-23  4681  		    (ctx_arg_info->reg_type == PTR_TO_RDONLY_BUF_OR_NULL ||
afbf21dce668ef Yonghong Song          2020-07-23  4682  		     ctx_arg_info->reg_type == PTR_TO_RDWR_BUF_OR_NULL)) {
afbf21dce668ef Yonghong Song          2020-07-23  4683  			info->reg_type = ctx_arg_info->reg_type;
afbf21dce668ef Yonghong Song          2020-07-23  4684  			return true;
afbf21dce668ef Yonghong Song          2020-07-23  4685  		}
afbf21dce668ef Yonghong Song          2020-07-23  4686  	}
afbf21dce668ef Yonghong Song          2020-07-23  4687  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4688  	if (t->type == 0)
9e15db66136a14 Alexei Starovoitov     2019-10-15  4689  		/* This is a pointer to void.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4690  		 * It is the same as scalar from the verifier safety pov.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4691  		 * No further pointer walking is allowed.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4692  		 */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4693  		return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4694  
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4695  	if (is_string_ptr(btf, t))
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4696  		return true;
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4697  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4698  	/* this is a pointer to another type */
3c32cc1bceba8a Yonghong Song          2020-05-13  4699  	for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
3c32cc1bceba8a Yonghong Song          2020-05-13  4700  		const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
3c32cc1bceba8a Yonghong Song          2020-05-13  4701  
3c32cc1bceba8a Yonghong Song          2020-05-13  4702  		if (ctx_arg_info->offset == off) {
3c32cc1bceba8a Yonghong Song          2020-05-13  4703  			info->reg_type = ctx_arg_info->reg_type;
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4704  			info->btf = btf_vmlinux;
951cf368bcb11d Yonghong Song          2020-07-20  4705  			info->btf_id = ctx_arg_info->btf_id;
951cf368bcb11d Yonghong Song          2020-07-20  4706  			return true;
3c32cc1bceba8a Yonghong Song          2020-05-13  4707  		}
3c32cc1bceba8a Yonghong Song          2020-05-13  4708  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4709  
951cf368bcb11d Yonghong Song          2020-07-20  4710  	info->reg_type = PTR_TO_BTF_ID;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4711  	if (tgt_prog) {
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4712  		enum bpf_prog_type tgt_type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4713  
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4714  		if (tgt_prog->type == BPF_PROG_TYPE_EXT)
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4715  			tgt_type = tgt_prog->aux->saved_dst_prog_type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4716  		else
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4717  			tgt_type = tgt_prog->type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4718  
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4719  		ret = btf_translate_to_vmlinux(log, btf, t, tgt_type, arg);
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4720  		if (ret > 0) {
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4721  			info->btf = btf_vmlinux;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4722  			info->btf_id = ret;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4723  			return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4724  		} else {
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4725  			return false;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4726  		}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4727  	}
275517ff452a53 Martin KaFai Lau       2020-01-08  4728  
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4729  	info->btf = btf;
275517ff452a53 Martin KaFai Lau       2020-01-08  4730  	info->btf_id = t->type;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4731  	t = btf_type_by_id(btf, t->type);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4732  	/* skip modifiers */
275517ff452a53 Martin KaFai Lau       2020-01-08  4733  	while (btf_type_is_modifier(t)) {
275517ff452a53 Martin KaFai Lau       2020-01-08  4734  		info->btf_id = t->type;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4735  		t = btf_type_by_id(btf, t->type);
275517ff452a53 Martin KaFai Lau       2020-01-08  4736  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4737  	if (!btf_type_is_struct(t)) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4738  		bpf_log(log,
38207291604401 Martin KaFai Lau       2019-10-24  4739  			"func '%s' arg%d type %s is not a struct\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4740  			tname, arg, btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4741  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4742  	}
38207291604401 Martin KaFai Lau       2019-10-24  4743  	bpf_log(log, "func '%s' arg%d has btf_id %d type %s '%s'\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4744  		tname, arg, info->btf_id, btf_kind_str[BTF_INFO_KIND(t->info)],
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4745  		__btf_name_by_offset(btf, t->name_off));
9e15db66136a14 Alexei Starovoitov     2019-10-15  4746  	return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4747  }
9e15db66136a14 Alexei Starovoitov     2019-10-15  4748  

:::::: The code at line 4596 was first introduced by commit
:::::: 9e15db66136a14cde3f35691f1d839d950118826 bpf: Implement accurate raw_tp context access via BTF

:::::: TO: Alexei Starovoitov <ast@kernel.org>
:::::: CC: Daniel Borkmann <daniel@iogearbox.net>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 5+ messages in thread

* kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
  2021-08-28 21:42 kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck] kernel test robot
@ 2021-08-29  7:30 ` kernel test robot
  0 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2021-08-29  7:30 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 16295 bytes --]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   64b4fc45bea6f4faa843d2f97ff51665280efee1
commit: 523a4cf491b3c9e2d546040d57250f1a0ca84f03 bpf: Use MAX_BPF_FUNC_REG_ARGS macro
date:   6 months ago
:::::: branch date: 23 hours ago
:::::: commit date: 6 months ago
compiler: s390-linux-gcc (GCC) 11.2.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

    kernel/bpf/btf.c:5723:13: warning: Boolean result is used in bitwise operation. Clarify expression with parentheses. [clarifyCondition]
     if (!uname ^ !uname_len)
                ^
 >> kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
     args = (const struct btf_param *)(t + 1);
                                         ^
    kernel/bpf/btf.c:4600:14: note: Assuming that condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is not redundant
     nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
                 ^
    kernel/bpf/btf.c:4596:38: note: Null pointer addition
     args = (const struct btf_param *)(t + 1);
                                         ^

vim +4596 kernel/bpf/btf.c

84ad7a7ab69f11 Jiri Olsa              2020-01-23  4576
9e15db66136a14 Alexei Starovoitov     2019-10-15  4577  bool btf_ctx_access(int off, int size, enum bpf_access_type type,
9e15db66136a14 Alexei Starovoitov     2019-10-15  4578  		    const struct bpf_prog *prog,
9e15db66136a14 Alexei Starovoitov     2019-10-15  4579  		    struct bpf_insn_access_aux *info)
9e15db66136a14 Alexei Starovoitov     2019-10-15  4580  {
38207291604401 Martin KaFai Lau       2019-10-24  4581  	const struct btf_type *t = prog->aux->attach_func_proto;
3aac1ead5eb6b7 Toke Høiland-Jørgensen 2020-09-29  4582  	struct bpf_prog *tgt_prog = prog->aux->dst_prog;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4583  	struct btf *btf = bpf_prog_get_target_btf(prog);
38207291604401 Martin KaFai Lau       2019-10-24  4584  	const char *tname = prog->aux->attach_func_name;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4585  	struct bpf_verifier_log *log = info->log;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4586  	const struct btf_param *args;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4587  	u32 nr_args, arg;
3c32cc1bceba8a Yonghong Song          2020-05-13  4588  	int i, ret;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4589
9e15db66136a14 Alexei Starovoitov     2019-10-15  4590  	if (off % 8) {
38207291604401 Martin KaFai Lau       2019-10-24  4591  		bpf_log(log, "func '%s' offset %d is not multiple of 8\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4592  			tname, off);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4593  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4594  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4595  	arg = off / 8;
9e15db66136a14 Alexei Starovoitov     2019-10-15 @4596  	args = (const struct btf_param *)(t + 1);
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4597  	/* if (t == NULL) Fall back to default BPF prog with
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4598  	 * MAX_BPF_FUNC_REG_ARGS u64 arguments.
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4599  	 */
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4600  	nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
38207291604401 Martin KaFai Lau       2019-10-24  4601  	if (prog->aux->attach_btf_trace) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4602  		/* skip first 'void *__data' argument in btf_trace_##name typedef */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4603  		args++;
38207291604401 Martin KaFai Lau       2019-10-24  4604  		nr_args--;
38207291604401 Martin KaFai Lau       2019-10-24  4605  	}
fec56f5890d93f Alexei Starovoitov     2019-11-14  4606
f50b49a0bfcaf5 KP Singh               2020-03-30  4607  	if (arg > nr_args) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4608  		bpf_log(log, "func '%s' doesn't have %d-th argument\n",
f50b49a0bfcaf5 KP Singh               2020-03-30  4609  			tname, arg + 1);
f50b49a0bfcaf5 KP Singh               2020-03-30  4610  		return false;
f50b49a0bfcaf5 KP Singh               2020-03-30  4611  	}
f50b49a0bfcaf5 KP Singh               2020-03-30  4612
6ba43b761c4134 KP Singh               2020-03-04  4613  	if (arg == nr_args) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4614  		switch (prog->expected_attach_type) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4615  		case BPF_LSM_MAC:
f50b49a0bfcaf5 KP Singh               2020-03-30  4616  		case BPF_TRACE_FEXIT:
9e4e01dfd3254c KP Singh               2020-03-29  4617  			/* When LSM programs are attached to void LSM hooks
9e4e01dfd3254c KP Singh               2020-03-29  4618  			 * they use FEXIT trampolines and when attached to
9e4e01dfd3254c KP Singh               2020-03-29  4619  			 * int LSM hooks, they use MODIFY_RETURN trampolines.
9e4e01dfd3254c KP Singh               2020-03-29  4620  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4621  			 * While the LSM programs are BPF_MODIFY_RETURN-like
9e4e01dfd3254c KP Singh               2020-03-29  4622  			 * the check:
9e4e01dfd3254c KP Singh               2020-03-29  4623  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4624  			 *	if (ret_type != 'int')
9e4e01dfd3254c KP Singh               2020-03-29  4625  			 *		return -EINVAL;
9e4e01dfd3254c KP Singh               2020-03-29  4626  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4627  			 * is _not_ done here. This is still safe as LSM hooks
9e4e01dfd3254c KP Singh               2020-03-29  4628  			 * have only void and int return types.
9e4e01dfd3254c KP Singh               2020-03-29  4629  			 */
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4630  			if (!t)
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4631  				return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4632  			t = btf_type_by_id(btf, t->type);
f50b49a0bfcaf5 KP Singh               2020-03-30  4633  			break;
f50b49a0bfcaf5 KP Singh               2020-03-30  4634  		case BPF_MODIFY_RETURN:
6ba43b761c4134 KP Singh               2020-03-04  4635  			/* For now the BPF_MODIFY_RETURN can only be attached to
6ba43b761c4134 KP Singh               2020-03-04  4636  			 * functions that return an int.
6ba43b761c4134 KP Singh               2020-03-04  4637  			 */
6ba43b761c4134 KP Singh               2020-03-04  4638  			if (!t)
6ba43b761c4134 KP Singh               2020-03-04  4639  				return false;
6ba43b761c4134 KP Singh               2020-03-04  4640
6ba43b761c4134 KP Singh               2020-03-04  4641  			t = btf_type_skip_modifiers(btf, t->type, NULL);
a9b59159d338d4 John Fastabend         2020-06-24  4642  			if (!btf_type_is_small_int(t)) {
6ba43b761c4134 KP Singh               2020-03-04  4643  				bpf_log(log,
6ba43b761c4134 KP Singh               2020-03-04  4644  					"ret type %s not allowed for fmod_ret\n",
6ba43b761c4134 KP Singh               2020-03-04  4645  					btf_kind_str[BTF_INFO_KIND(t->info)]);
6ba43b761c4134 KP Singh               2020-03-04  4646  				return false;
6ba43b761c4134 KP Singh               2020-03-04  4647  			}
f50b49a0bfcaf5 KP Singh               2020-03-30  4648  			break;
f50b49a0bfcaf5 KP Singh               2020-03-30  4649  		default:
38207291604401 Martin KaFai Lau       2019-10-24  4650  			bpf_log(log, "func '%s' doesn't have %d-th argument\n",
fec56f5890d93f Alexei Starovoitov     2019-11-14  4651  				tname, arg + 1);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4652  			return false;
f50b49a0bfcaf5 KP Singh               2020-03-30  4653  		}
fec56f5890d93f Alexei Starovoitov     2019-11-14  4654  	} else {
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4655  		if (!t)
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4656  			/* Default prog with MAX_BPF_FUNC_REG_ARGS args */
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4657  			return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4658  		t = btf_type_by_id(btf, args[arg].type);
fec56f5890d93f Alexei Starovoitov     2019-11-14  4659  	}
f50b49a0bfcaf5 KP Singh               2020-03-30  4660
9e15db66136a14 Alexei Starovoitov     2019-10-15  4661  	/* skip modifiers */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4662  	while (btf_type_is_modifier(t))
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4663  		t = btf_type_by_id(btf, t->type);
a9b59159d338d4 John Fastabend         2020-06-24  4664  	if (btf_type_is_small_int(t) || btf_type_is_enum(t))
9e15db66136a14 Alexei Starovoitov     2019-10-15  4665  		/* accessing a scalar */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4666  		return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4667  	if (!btf_type_is_ptr(t)) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4668  		bpf_log(log,
38207291604401 Martin KaFai Lau       2019-10-24  4669  			"func '%s' arg%d '%s' has type %s. Only pointer access is allowed\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4670  			tname, arg,
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4671  			__btf_name_by_offset(btf, t->name_off),
9e15db66136a14 Alexei Starovoitov     2019-10-15  4672  			btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4673  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4674  	}
afbf21dce668ef Yonghong Song          2020-07-23  4675
afbf21dce668ef Yonghong Song          2020-07-23  4676  	/* check for PTR_TO_RDONLY_BUF_OR_NULL or PTR_TO_RDWR_BUF_OR_NULL */
afbf21dce668ef Yonghong Song          2020-07-23  4677  	for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
afbf21dce668ef Yonghong Song          2020-07-23  4678  		const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
afbf21dce668ef Yonghong Song          2020-07-23  4679
afbf21dce668ef Yonghong Song          2020-07-23  4680  		if (ctx_arg_info->offset == off &&
afbf21dce668ef Yonghong Song          2020-07-23  4681  		    (ctx_arg_info->reg_type == PTR_TO_RDONLY_BUF_OR_NULL ||
afbf21dce668ef Yonghong Song          2020-07-23  4682  		     ctx_arg_info->reg_type == PTR_TO_RDWR_BUF_OR_NULL)) {
afbf21dce668ef Yonghong Song          2020-07-23  4683  			info->reg_type = ctx_arg_info->reg_type;
afbf21dce668ef Yonghong Song          2020-07-23  4684  			return true;
afbf21dce668ef Yonghong Song          2020-07-23  4685  		}
afbf21dce668ef Yonghong Song          2020-07-23  4686  	}
afbf21dce668ef Yonghong Song          2020-07-23  4687
9e15db66136a14 Alexei Starovoitov     2019-10-15  4688  	if (t->type == 0)
9e15db66136a14 Alexei Starovoitov     2019-10-15  4689  		/* This is a pointer to void.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4690  		 * It is the same as scalar from the verifier safety pov.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4691  		 * No further pointer walking is allowed.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4692  		 */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4693  		return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4694
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4695  	if (is_string_ptr(btf, t))
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4696  		return true;
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4697
9e15db66136a14 Alexei Starovoitov     2019-10-15  4698  	/* this is a pointer to another type */
3c32cc1bceba8a Yonghong Song          2020-05-13  4699  	for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
3c32cc1bceba8a Yonghong Song          2020-05-13  4700  		const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
3c32cc1bceba8a Yonghong Song          2020-05-13  4701
3c32cc1bceba8a Yonghong Song          2020-05-13  4702  		if (ctx_arg_info->offset == off) {
3c32cc1bceba8a Yonghong Song          2020-05-13  4703  			info->reg_type = ctx_arg_info->reg_type;
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4704  			info->btf = btf_vmlinux;
951cf368bcb11d Yonghong Song          2020-07-20  4705  			info->btf_id = ctx_arg_info->btf_id;
951cf368bcb11d Yonghong Song          2020-07-20  4706  			return true;
3c32cc1bceba8a Yonghong Song          2020-05-13  4707  		}
3c32cc1bceba8a Yonghong Song          2020-05-13  4708  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4709
951cf368bcb11d Yonghong Song          2020-07-20  4710  	info->reg_type = PTR_TO_BTF_ID;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4711  	if (tgt_prog) {
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4712  		enum bpf_prog_type tgt_type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4713
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4714  		if (tgt_prog->type == BPF_PROG_TYPE_EXT)
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4715  			tgt_type = tgt_prog->aux->saved_dst_prog_type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4716  		else
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4717  			tgt_type = tgt_prog->type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4718
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4719  		ret = btf_translate_to_vmlinux(log, btf, t, tgt_type, arg);
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4720  		if (ret > 0) {
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4721  			info->btf = btf_vmlinux;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4722  			info->btf_id = ret;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4723  			return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4724  		} else {
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4725  			return false;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4726  		}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4727  	}
275517ff452a53 Martin KaFai Lau       2020-01-08  4728
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4729  	info->btf = btf;
275517ff452a53 Martin KaFai Lau       2020-01-08  4730  	info->btf_id = t->type;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4731  	t = btf_type_by_id(btf, t->type);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4732  	/* skip modifiers */
275517ff452a53 Martin KaFai Lau       2020-01-08  4733  	while (btf_type_is_modifier(t)) {
275517ff452a53 Martin KaFai Lau       2020-01-08  4734  		info->btf_id = t->type;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4735  		t = btf_type_by_id(btf, t->type);
275517ff452a53 Martin KaFai Lau       2020-01-08  4736  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4737  	if (!btf_type_is_struct(t)) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4738  		bpf_log(log,
38207291604401 Martin KaFai Lau       2019-10-24  4739  			"func '%s' arg%d type %s is not a struct\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4740  			tname, arg, btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4741  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4742  	}
38207291604401 Martin KaFai Lau       2019-10-24  4743  	bpf_log(log, "func '%s' arg%d has btf_id %d type %s '%s'\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4744  		tname, arg, info->btf_id, btf_kind_str[BTF_INFO_KIND(t->info)],
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4745  		__btf_name_by_offset(btf, t->name_off));
9e15db66136a14 Alexei Starovoitov     2019-10-15  4746  	return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4747  }
9e15db66136a14 Alexei Starovoitov     2019-10-15  4748

:::::: The code at line 4596 was first introduced by commit
:::::: 9e15db66136a14cde3f35691f1d839d950118826 bpf: Implement accurate raw_tp context access via BTF

:::::: TO: Alexei Starovoitov <ast@kernel.org>
:::::: CC: Daniel Borkmann <daniel@iogearbox.net>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 5+ messages in thread

* kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
@ 2022-01-19 20:13 kernel test robot
  0 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2022-01-19 20:13 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 16472 bytes --]

CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Dmitrii Banshchikov <me@ubique.spb.ru>
CC: Alexei Starovoitov <ast@kernel.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   1d1df41c5a33359a00e919d54eaebfb789711fdc
commit: 523a4cf491b3c9e2d546040d57250f1a0ca84f03 bpf: Use MAX_BPF_FUNC_REG_ARGS macro
date:   11 months ago
:::::: branch date: 9 hours ago
:::::: commit date: 11 months ago
compiler: m68k-linux-gcc (GCC) 11.2.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

   kernel/bpf/btf.c:5723:13: warning: Boolean result is used in bitwise operation. Clarify expression with parentheses. [clarifyCondition]
    if (!uname ^ !uname_len)
               ^
>> kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
    args = (const struct btf_param *)(t + 1);
                                        ^
   kernel/bpf/btf.c:4600:14: note: Assuming that condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is not redundant
    nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
                ^
   kernel/bpf/btf.c:4596:38: note: Null pointer addition
    args = (const struct btf_param *)(t + 1);
                                        ^

vim +4596 kernel/bpf/btf.c

84ad7a7ab69f11 Jiri Olsa              2020-01-23  4576  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4577  bool btf_ctx_access(int off, int size, enum bpf_access_type type,
9e15db66136a14 Alexei Starovoitov     2019-10-15  4578  		    const struct bpf_prog *prog,
9e15db66136a14 Alexei Starovoitov     2019-10-15  4579  		    struct bpf_insn_access_aux *info)
9e15db66136a14 Alexei Starovoitov     2019-10-15  4580  {
38207291604401 Martin KaFai Lau       2019-10-24  4581  	const struct btf_type *t = prog->aux->attach_func_proto;
3aac1ead5eb6b7 Toke Høiland-Jørgensen 2020-09-29  4582  	struct bpf_prog *tgt_prog = prog->aux->dst_prog;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4583  	struct btf *btf = bpf_prog_get_target_btf(prog);
38207291604401 Martin KaFai Lau       2019-10-24  4584  	const char *tname = prog->aux->attach_func_name;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4585  	struct bpf_verifier_log *log = info->log;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4586  	const struct btf_param *args;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4587  	u32 nr_args, arg;
3c32cc1bceba8a Yonghong Song          2020-05-13  4588  	int i, ret;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4589  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4590  	if (off % 8) {
38207291604401 Martin KaFai Lau       2019-10-24  4591  		bpf_log(log, "func '%s' offset %d is not multiple of 8\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4592  			tname, off);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4593  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4594  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4595  	arg = off / 8;
9e15db66136a14 Alexei Starovoitov     2019-10-15 @4596  	args = (const struct btf_param *)(t + 1);
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4597  	/* if (t == NULL) Fall back to default BPF prog with
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4598  	 * MAX_BPF_FUNC_REG_ARGS u64 arguments.
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4599  	 */
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4600  	nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
38207291604401 Martin KaFai Lau       2019-10-24  4601  	if (prog->aux->attach_btf_trace) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4602  		/* skip first 'void *__data' argument in btf_trace_##name typedef */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4603  		args++;
38207291604401 Martin KaFai Lau       2019-10-24  4604  		nr_args--;
38207291604401 Martin KaFai Lau       2019-10-24  4605  	}
fec56f5890d93f Alexei Starovoitov     2019-11-14  4606  
f50b49a0bfcaf5 KP Singh               2020-03-30  4607  	if (arg > nr_args) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4608  		bpf_log(log, "func '%s' doesn't have %d-th argument\n",
f50b49a0bfcaf5 KP Singh               2020-03-30  4609  			tname, arg + 1);
f50b49a0bfcaf5 KP Singh               2020-03-30  4610  		return false;
f50b49a0bfcaf5 KP Singh               2020-03-30  4611  	}
f50b49a0bfcaf5 KP Singh               2020-03-30  4612  
6ba43b761c4134 KP Singh               2020-03-04  4613  	if (arg == nr_args) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4614  		switch (prog->expected_attach_type) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4615  		case BPF_LSM_MAC:
f50b49a0bfcaf5 KP Singh               2020-03-30  4616  		case BPF_TRACE_FEXIT:
9e4e01dfd3254c KP Singh               2020-03-29  4617  			/* When LSM programs are attached to void LSM hooks
9e4e01dfd3254c KP Singh               2020-03-29  4618  			 * they use FEXIT trampolines and when attached to
9e4e01dfd3254c KP Singh               2020-03-29  4619  			 * int LSM hooks, they use MODIFY_RETURN trampolines.
9e4e01dfd3254c KP Singh               2020-03-29  4620  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4621  			 * While the LSM programs are BPF_MODIFY_RETURN-like
9e4e01dfd3254c KP Singh               2020-03-29  4622  			 * the check:
9e4e01dfd3254c KP Singh               2020-03-29  4623  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4624  			 *	if (ret_type != 'int')
9e4e01dfd3254c KP Singh               2020-03-29  4625  			 *		return -EINVAL;
9e4e01dfd3254c KP Singh               2020-03-29  4626  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4627  			 * is _not_ done here. This is still safe as LSM hooks
9e4e01dfd3254c KP Singh               2020-03-29  4628  			 * have only void and int return types.
9e4e01dfd3254c KP Singh               2020-03-29  4629  			 */
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4630  			if (!t)
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4631  				return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4632  			t = btf_type_by_id(btf, t->type);
f50b49a0bfcaf5 KP Singh               2020-03-30  4633  			break;
f50b49a0bfcaf5 KP Singh               2020-03-30  4634  		case BPF_MODIFY_RETURN:
6ba43b761c4134 KP Singh               2020-03-04  4635  			/* For now the BPF_MODIFY_RETURN can only be attached to
6ba43b761c4134 KP Singh               2020-03-04  4636  			 * functions that return an int.
6ba43b761c4134 KP Singh               2020-03-04  4637  			 */
6ba43b761c4134 KP Singh               2020-03-04  4638  			if (!t)
6ba43b761c4134 KP Singh               2020-03-04  4639  				return false;
6ba43b761c4134 KP Singh               2020-03-04  4640  
6ba43b761c4134 KP Singh               2020-03-04  4641  			t = btf_type_skip_modifiers(btf, t->type, NULL);
a9b59159d338d4 John Fastabend         2020-06-24  4642  			if (!btf_type_is_small_int(t)) {
6ba43b761c4134 KP Singh               2020-03-04  4643  				bpf_log(log,
6ba43b761c4134 KP Singh               2020-03-04  4644  					"ret type %s not allowed for fmod_ret\n",
6ba43b761c4134 KP Singh               2020-03-04  4645  					btf_kind_str[BTF_INFO_KIND(t->info)]);
6ba43b761c4134 KP Singh               2020-03-04  4646  				return false;
6ba43b761c4134 KP Singh               2020-03-04  4647  			}
f50b49a0bfcaf5 KP Singh               2020-03-30  4648  			break;
f50b49a0bfcaf5 KP Singh               2020-03-30  4649  		default:
38207291604401 Martin KaFai Lau       2019-10-24  4650  			bpf_log(log, "func '%s' doesn't have %d-th argument\n",
fec56f5890d93f Alexei Starovoitov     2019-11-14  4651  				tname, arg + 1);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4652  			return false;
f50b49a0bfcaf5 KP Singh               2020-03-30  4653  		}
fec56f5890d93f Alexei Starovoitov     2019-11-14  4654  	} else {
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4655  		if (!t)
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4656  			/* Default prog with MAX_BPF_FUNC_REG_ARGS args */
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4657  			return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4658  		t = btf_type_by_id(btf, args[arg].type);
fec56f5890d93f Alexei Starovoitov     2019-11-14  4659  	}
f50b49a0bfcaf5 KP Singh               2020-03-30  4660  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4661  	/* skip modifiers */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4662  	while (btf_type_is_modifier(t))
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4663  		t = btf_type_by_id(btf, t->type);
a9b59159d338d4 John Fastabend         2020-06-24  4664  	if (btf_type_is_small_int(t) || btf_type_is_enum(t))
9e15db66136a14 Alexei Starovoitov     2019-10-15  4665  		/* accessing a scalar */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4666  		return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4667  	if (!btf_type_is_ptr(t)) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4668  		bpf_log(log,
38207291604401 Martin KaFai Lau       2019-10-24  4669  			"func '%s' arg%d '%s' has type %s. Only pointer access is allowed\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4670  			tname, arg,
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4671  			__btf_name_by_offset(btf, t->name_off),
9e15db66136a14 Alexei Starovoitov     2019-10-15  4672  			btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4673  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4674  	}
afbf21dce668ef Yonghong Song          2020-07-23  4675  
afbf21dce668ef Yonghong Song          2020-07-23  4676  	/* check for PTR_TO_RDONLY_BUF_OR_NULL or PTR_TO_RDWR_BUF_OR_NULL */
afbf21dce668ef Yonghong Song          2020-07-23  4677  	for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
afbf21dce668ef Yonghong Song          2020-07-23  4678  		const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
afbf21dce668ef Yonghong Song          2020-07-23  4679  
afbf21dce668ef Yonghong Song          2020-07-23  4680  		if (ctx_arg_info->offset == off &&
afbf21dce668ef Yonghong Song          2020-07-23  4681  		    (ctx_arg_info->reg_type == PTR_TO_RDONLY_BUF_OR_NULL ||
afbf21dce668ef Yonghong Song          2020-07-23  4682  		     ctx_arg_info->reg_type == PTR_TO_RDWR_BUF_OR_NULL)) {
afbf21dce668ef Yonghong Song          2020-07-23  4683  			info->reg_type = ctx_arg_info->reg_type;
afbf21dce668ef Yonghong Song          2020-07-23  4684  			return true;
afbf21dce668ef Yonghong Song          2020-07-23  4685  		}
afbf21dce668ef Yonghong Song          2020-07-23  4686  	}
afbf21dce668ef Yonghong Song          2020-07-23  4687  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4688  	if (t->type == 0)
9e15db66136a14 Alexei Starovoitov     2019-10-15  4689  		/* This is a pointer to void.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4690  		 * It is the same as scalar from the verifier safety pov.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4691  		 * No further pointer walking is allowed.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4692  		 */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4693  		return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4694  
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4695  	if (is_string_ptr(btf, t))
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4696  		return true;
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4697  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4698  	/* this is a pointer to another type */
3c32cc1bceba8a Yonghong Song          2020-05-13  4699  	for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
3c32cc1bceba8a Yonghong Song          2020-05-13  4700  		const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
3c32cc1bceba8a Yonghong Song          2020-05-13  4701  
3c32cc1bceba8a Yonghong Song          2020-05-13  4702  		if (ctx_arg_info->offset == off) {
3c32cc1bceba8a Yonghong Song          2020-05-13  4703  			info->reg_type = ctx_arg_info->reg_type;
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4704  			info->btf = btf_vmlinux;
951cf368bcb11d Yonghong Song          2020-07-20  4705  			info->btf_id = ctx_arg_info->btf_id;
951cf368bcb11d Yonghong Song          2020-07-20  4706  			return true;
3c32cc1bceba8a Yonghong Song          2020-05-13  4707  		}
3c32cc1bceba8a Yonghong Song          2020-05-13  4708  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4709  
951cf368bcb11d Yonghong Song          2020-07-20  4710  	info->reg_type = PTR_TO_BTF_ID;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4711  	if (tgt_prog) {
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4712  		enum bpf_prog_type tgt_type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4713  
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4714  		if (tgt_prog->type == BPF_PROG_TYPE_EXT)
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4715  			tgt_type = tgt_prog->aux->saved_dst_prog_type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4716  		else
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4717  			tgt_type = tgt_prog->type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4718  
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4719  		ret = btf_translate_to_vmlinux(log, btf, t, tgt_type, arg);
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4720  		if (ret > 0) {
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4721  			info->btf = btf_vmlinux;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4722  			info->btf_id = ret;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4723  			return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4724  		} else {
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4725  			return false;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4726  		}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4727  	}
275517ff452a53 Martin KaFai Lau       2020-01-08  4728  
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4729  	info->btf = btf;
275517ff452a53 Martin KaFai Lau       2020-01-08  4730  	info->btf_id = t->type;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4731  	t = btf_type_by_id(btf, t->type);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4732  	/* skip modifiers */
275517ff452a53 Martin KaFai Lau       2020-01-08  4733  	while (btf_type_is_modifier(t)) {
275517ff452a53 Martin KaFai Lau       2020-01-08  4734  		info->btf_id = t->type;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4735  		t = btf_type_by_id(btf, t->type);
275517ff452a53 Martin KaFai Lau       2020-01-08  4736  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4737  	if (!btf_type_is_struct(t)) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4738  		bpf_log(log,
38207291604401 Martin KaFai Lau       2019-10-24  4739  			"func '%s' arg%d type %s is not a struct\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4740  			tname, arg, btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4741  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4742  	}
38207291604401 Martin KaFai Lau       2019-10-24  4743  	bpf_log(log, "func '%s' arg%d has btf_id %d type %s '%s'\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4744  		tname, arg, info->btf_id, btf_kind_str[BTF_INFO_KIND(t->info)],
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4745  		__btf_name_by_offset(btf, t->name_off));
9e15db66136a14 Alexei Starovoitov     2019-10-15  4746  	return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4747  }
9e15db66136a14 Alexei Starovoitov     2019-10-15  4748  

:::::: The code at line 4596 was first introduced by commit
:::::: 9e15db66136a14cde3f35691f1d839d950118826 bpf: Implement accurate raw_tp context access via BTF

:::::: TO: Alexei Starovoitov <ast@kernel.org>
:::::: CC: Daniel Borkmann <daniel@iogearbox.net>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 5+ messages in thread

* kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
@ 2021-12-07  2:22 kernel test robot
  0 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2021-12-07  2:22 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 16467 bytes --]

CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Dmitrii Banshchikov <me@ubique.spb.ru>
CC: Alexei Starovoitov <ast@kernel.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   f80ef9e49fdfbfbc4197711230098b90e6b05a7e
commit: 523a4cf491b3c9e2d546040d57250f1a0ca84f03 bpf: Use MAX_BPF_FUNC_REG_ARGS macro
date:   9 months ago
:::::: branch date: 7 hours ago
:::::: commit date: 9 months ago
compiler: arc-elf-gcc (GCC) 11.2.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

   kernel/bpf/btf.c:5723:13: warning: Boolean result is used in bitwise operation. Clarify expression with parentheses. [clarifyCondition]
    if (!uname ^ !uname_len)
               ^
>> kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
    args = (const struct btf_param *)(t + 1);
                                        ^
   kernel/bpf/btf.c:4600:14: note: Assuming that condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is not redundant
    nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
                ^
   kernel/bpf/btf.c:4596:38: note: Null pointer addition
    args = (const struct btf_param *)(t + 1);
                                        ^

vim +4596 kernel/bpf/btf.c

84ad7a7ab69f11 Jiri Olsa              2020-01-23  4576  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4577  bool btf_ctx_access(int off, int size, enum bpf_access_type type,
9e15db66136a14 Alexei Starovoitov     2019-10-15  4578  		    const struct bpf_prog *prog,
9e15db66136a14 Alexei Starovoitov     2019-10-15  4579  		    struct bpf_insn_access_aux *info)
9e15db66136a14 Alexei Starovoitov     2019-10-15  4580  {
38207291604401 Martin KaFai Lau       2019-10-24  4581  	const struct btf_type *t = prog->aux->attach_func_proto;
3aac1ead5eb6b7 Toke Høiland-Jørgensen 2020-09-29  4582  	struct bpf_prog *tgt_prog = prog->aux->dst_prog;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4583  	struct btf *btf = bpf_prog_get_target_btf(prog);
38207291604401 Martin KaFai Lau       2019-10-24  4584  	const char *tname = prog->aux->attach_func_name;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4585  	struct bpf_verifier_log *log = info->log;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4586  	const struct btf_param *args;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4587  	u32 nr_args, arg;
3c32cc1bceba8a Yonghong Song          2020-05-13  4588  	int i, ret;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4589  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4590  	if (off % 8) {
38207291604401 Martin KaFai Lau       2019-10-24  4591  		bpf_log(log, "func '%s' offset %d is not multiple of 8\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4592  			tname, off);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4593  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4594  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4595  	arg = off / 8;
9e15db66136a14 Alexei Starovoitov     2019-10-15 @4596  	args = (const struct btf_param *)(t + 1);
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4597  	/* if (t == NULL) Fall back to default BPF prog with
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4598  	 * MAX_BPF_FUNC_REG_ARGS u64 arguments.
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4599  	 */
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4600  	nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
38207291604401 Martin KaFai Lau       2019-10-24  4601  	if (prog->aux->attach_btf_trace) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4602  		/* skip first 'void *__data' argument in btf_trace_##name typedef */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4603  		args++;
38207291604401 Martin KaFai Lau       2019-10-24  4604  		nr_args--;
38207291604401 Martin KaFai Lau       2019-10-24  4605  	}
fec56f5890d93f Alexei Starovoitov     2019-11-14  4606  
f50b49a0bfcaf5 KP Singh               2020-03-30  4607  	if (arg > nr_args) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4608  		bpf_log(log, "func '%s' doesn't have %d-th argument\n",
f50b49a0bfcaf5 KP Singh               2020-03-30  4609  			tname, arg + 1);
f50b49a0bfcaf5 KP Singh               2020-03-30  4610  		return false;
f50b49a0bfcaf5 KP Singh               2020-03-30  4611  	}
f50b49a0bfcaf5 KP Singh               2020-03-30  4612  
6ba43b761c4134 KP Singh               2020-03-04  4613  	if (arg == nr_args) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4614  		switch (prog->expected_attach_type) {
f50b49a0bfcaf5 KP Singh               2020-03-30  4615  		case BPF_LSM_MAC:
f50b49a0bfcaf5 KP Singh               2020-03-30  4616  		case BPF_TRACE_FEXIT:
9e4e01dfd3254c KP Singh               2020-03-29  4617  			/* When LSM programs are attached to void LSM hooks
9e4e01dfd3254c KP Singh               2020-03-29  4618  			 * they use FEXIT trampolines and when attached to
9e4e01dfd3254c KP Singh               2020-03-29  4619  			 * int LSM hooks, they use MODIFY_RETURN trampolines.
9e4e01dfd3254c KP Singh               2020-03-29  4620  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4621  			 * While the LSM programs are BPF_MODIFY_RETURN-like
9e4e01dfd3254c KP Singh               2020-03-29  4622  			 * the check:
9e4e01dfd3254c KP Singh               2020-03-29  4623  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4624  			 *	if (ret_type != 'int')
9e4e01dfd3254c KP Singh               2020-03-29  4625  			 *		return -EINVAL;
9e4e01dfd3254c KP Singh               2020-03-29  4626  			 *
9e4e01dfd3254c KP Singh               2020-03-29  4627  			 * is _not_ done here. This is still safe as LSM hooks
9e4e01dfd3254c KP Singh               2020-03-29  4628  			 * have only void and int return types.
9e4e01dfd3254c KP Singh               2020-03-29  4629  			 */
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4630  			if (!t)
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4631  				return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4632  			t = btf_type_by_id(btf, t->type);
f50b49a0bfcaf5 KP Singh               2020-03-30  4633  			break;
f50b49a0bfcaf5 KP Singh               2020-03-30  4634  		case BPF_MODIFY_RETURN:
6ba43b761c4134 KP Singh               2020-03-04  4635  			/* For now the BPF_MODIFY_RETURN can only be attached to
6ba43b761c4134 KP Singh               2020-03-04  4636  			 * functions that return an int.
6ba43b761c4134 KP Singh               2020-03-04  4637  			 */
6ba43b761c4134 KP Singh               2020-03-04  4638  			if (!t)
6ba43b761c4134 KP Singh               2020-03-04  4639  				return false;
6ba43b761c4134 KP Singh               2020-03-04  4640  
6ba43b761c4134 KP Singh               2020-03-04  4641  			t = btf_type_skip_modifiers(btf, t->type, NULL);
a9b59159d338d4 John Fastabend         2020-06-24  4642  			if (!btf_type_is_small_int(t)) {
6ba43b761c4134 KP Singh               2020-03-04  4643  				bpf_log(log,
6ba43b761c4134 KP Singh               2020-03-04  4644  					"ret type %s not allowed for fmod_ret\n",
6ba43b761c4134 KP Singh               2020-03-04  4645  					btf_kind_str[BTF_INFO_KIND(t->info)]);
6ba43b761c4134 KP Singh               2020-03-04  4646  				return false;
6ba43b761c4134 KP Singh               2020-03-04  4647  			}
f50b49a0bfcaf5 KP Singh               2020-03-30  4648  			break;
f50b49a0bfcaf5 KP Singh               2020-03-30  4649  		default:
38207291604401 Martin KaFai Lau       2019-10-24  4650  			bpf_log(log, "func '%s' doesn't have %d-th argument\n",
fec56f5890d93f Alexei Starovoitov     2019-11-14  4651  				tname, arg + 1);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4652  			return false;
f50b49a0bfcaf5 KP Singh               2020-03-30  4653  		}
fec56f5890d93f Alexei Starovoitov     2019-11-14  4654  	} else {
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4655  		if (!t)
523a4cf491b3c9 Dmitrii Banshchikov    2021-02-26  4656  			/* Default prog with MAX_BPF_FUNC_REG_ARGS args */
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4657  			return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4658  		t = btf_type_by_id(btf, args[arg].type);
fec56f5890d93f Alexei Starovoitov     2019-11-14  4659  	}
f50b49a0bfcaf5 KP Singh               2020-03-30  4660  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4661  	/* skip modifiers */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4662  	while (btf_type_is_modifier(t))
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4663  		t = btf_type_by_id(btf, t->type);
a9b59159d338d4 John Fastabend         2020-06-24  4664  	if (btf_type_is_small_int(t) || btf_type_is_enum(t))
9e15db66136a14 Alexei Starovoitov     2019-10-15  4665  		/* accessing a scalar */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4666  		return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4667  	if (!btf_type_is_ptr(t)) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4668  		bpf_log(log,
38207291604401 Martin KaFai Lau       2019-10-24  4669  			"func '%s' arg%d '%s' has type %s. Only pointer access is allowed\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4670  			tname, arg,
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4671  			__btf_name_by_offset(btf, t->name_off),
9e15db66136a14 Alexei Starovoitov     2019-10-15  4672  			btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4673  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4674  	}
afbf21dce668ef Yonghong Song          2020-07-23  4675  
afbf21dce668ef Yonghong Song          2020-07-23  4676  	/* check for PTR_TO_RDONLY_BUF_OR_NULL or PTR_TO_RDWR_BUF_OR_NULL */
afbf21dce668ef Yonghong Song          2020-07-23  4677  	for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
afbf21dce668ef Yonghong Song          2020-07-23  4678  		const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
afbf21dce668ef Yonghong Song          2020-07-23  4679  
afbf21dce668ef Yonghong Song          2020-07-23  4680  		if (ctx_arg_info->offset == off &&
afbf21dce668ef Yonghong Song          2020-07-23  4681  		    (ctx_arg_info->reg_type == PTR_TO_RDONLY_BUF_OR_NULL ||
afbf21dce668ef Yonghong Song          2020-07-23  4682  		     ctx_arg_info->reg_type == PTR_TO_RDWR_BUF_OR_NULL)) {
afbf21dce668ef Yonghong Song          2020-07-23  4683  			info->reg_type = ctx_arg_info->reg_type;
afbf21dce668ef Yonghong Song          2020-07-23  4684  			return true;
afbf21dce668ef Yonghong Song          2020-07-23  4685  		}
afbf21dce668ef Yonghong Song          2020-07-23  4686  	}
afbf21dce668ef Yonghong Song          2020-07-23  4687  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4688  	if (t->type == 0)
9e15db66136a14 Alexei Starovoitov     2019-10-15  4689  		/* This is a pointer to void.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4690  		 * It is the same as scalar from the verifier safety pov.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4691  		 * No further pointer walking is allowed.
9e15db66136a14 Alexei Starovoitov     2019-10-15  4692  		 */
9e15db66136a14 Alexei Starovoitov     2019-10-15  4693  		return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4694  
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4695  	if (is_string_ptr(btf, t))
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4696  		return true;
84ad7a7ab69f11 Jiri Olsa              2020-01-23  4697  
9e15db66136a14 Alexei Starovoitov     2019-10-15  4698  	/* this is a pointer to another type */
3c32cc1bceba8a Yonghong Song          2020-05-13  4699  	for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
3c32cc1bceba8a Yonghong Song          2020-05-13  4700  		const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
3c32cc1bceba8a Yonghong Song          2020-05-13  4701  
3c32cc1bceba8a Yonghong Song          2020-05-13  4702  		if (ctx_arg_info->offset == off) {
3c32cc1bceba8a Yonghong Song          2020-05-13  4703  			info->reg_type = ctx_arg_info->reg_type;
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4704  			info->btf = btf_vmlinux;
951cf368bcb11d Yonghong Song          2020-07-20  4705  			info->btf_id = ctx_arg_info->btf_id;
951cf368bcb11d Yonghong Song          2020-07-20  4706  			return true;
3c32cc1bceba8a Yonghong Song          2020-05-13  4707  		}
3c32cc1bceba8a Yonghong Song          2020-05-13  4708  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4709  
951cf368bcb11d Yonghong Song          2020-07-20  4710  	info->reg_type = PTR_TO_BTF_ID;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4711  	if (tgt_prog) {
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4712  		enum bpf_prog_type tgt_type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4713  
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4714  		if (tgt_prog->type == BPF_PROG_TYPE_EXT)
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4715  			tgt_type = tgt_prog->aux->saved_dst_prog_type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4716  		else
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4717  			tgt_type = tgt_prog->type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4718  
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29  4719  		ret = btf_translate_to_vmlinux(log, btf, t, tgt_type, arg);
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4720  		if (ret > 0) {
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4721  			info->btf = btf_vmlinux;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4722  			info->btf_id = ret;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4723  			return true;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4724  		} else {
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4725  			return false;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4726  		}
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4727  	}
275517ff452a53 Martin KaFai Lau       2020-01-08  4728  
22dc4a0f5ed11b Andrii Nakryiko        2020-12-03  4729  	info->btf = btf;
275517ff452a53 Martin KaFai Lau       2020-01-08  4730  	info->btf_id = t->type;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4731  	t = btf_type_by_id(btf, t->type);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4732  	/* skip modifiers */
275517ff452a53 Martin KaFai Lau       2020-01-08  4733  	while (btf_type_is_modifier(t)) {
275517ff452a53 Martin KaFai Lau       2020-01-08  4734  		info->btf_id = t->type;
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4735  		t = btf_type_by_id(btf, t->type);
275517ff452a53 Martin KaFai Lau       2020-01-08  4736  	}
9e15db66136a14 Alexei Starovoitov     2019-10-15  4737  	if (!btf_type_is_struct(t)) {
9e15db66136a14 Alexei Starovoitov     2019-10-15  4738  		bpf_log(log,
38207291604401 Martin KaFai Lau       2019-10-24  4739  			"func '%s' arg%d type %s is not a struct\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4740  			tname, arg, btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14 Alexei Starovoitov     2019-10-15  4741  		return false;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4742  	}
38207291604401 Martin KaFai Lau       2019-10-24  4743  	bpf_log(log, "func '%s' arg%d has btf_id %d type %s '%s'\n",
9e15db66136a14 Alexei Starovoitov     2019-10-15  4744  		tname, arg, info->btf_id, btf_kind_str[BTF_INFO_KIND(t->info)],
5b92a28aae4dd0 Alexei Starovoitov     2019-11-14  4745  		__btf_name_by_offset(btf, t->name_off));
9e15db66136a14 Alexei Starovoitov     2019-10-15  4746  	return true;
9e15db66136a14 Alexei Starovoitov     2019-10-15  4747  }
9e15db66136a14 Alexei Starovoitov     2019-10-15  4748  

:::::: The code at line 4596 was first introduced by commit
:::::: 9e15db66136a14cde3f35691f1d839d950118826 bpf: Implement accurate raw_tp context access via BTF

:::::: TO: Alexei Starovoitov <ast@kernel.org>
:::::: CC: Daniel Borkmann <daniel@iogearbox.net>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 5+ messages in thread

* kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
@ 2021-06-24  3:26 kernel test robot
  0 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2021-06-24  3:26 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 16815 bytes --]

CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: Dmitrii Banshchikov <me@ubique.spb.ru>
CC: Alexei Starovoitov <ast@kernel.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   7426cedc7dad67bf3c71ea6cc29ab7822e1a453f
commit: 523a4cf491b3c9e2d546040d57250f1a0ca84f03 bpf: Use MAX_BPF_FUNC_REG_ARGS macro
date:   4 months ago
:::::: branch date: 9 hours ago
:::::: commit date: 4 months ago
compiler: ia64-linux-gcc (GCC) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

   kernel/bpf/btf.c:5723:13: warning: Boolean result is used in bitwise operation. Clarify expression with parentheses. [clarifyCondition]
    if (!uname ^ !uname_len)
               ^
>> kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
    args = (const struct btf_param *)(t + 1);
                                        ^
   kernel/bpf/btf.c:4600:14: note: Assuming that condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is not redundant
    nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
                ^
   kernel/bpf/btf.c:4596:38: note: Null pointer addition
    args = (const struct btf_param *)(t + 1);
                                        ^

vim +4596 kernel/bpf/btf.c

84ad7a7ab69f112c Jiri Olsa              2020-01-23  4576  
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4577  bool btf_ctx_access(int off, int size, enum bpf_access_type type,
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4578  		    const struct bpf_prog *prog,
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4579  		    struct bpf_insn_access_aux *info)
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4580  {
3820729160440158 Martin KaFai Lau       2019-10-24  4581  	const struct btf_type *t = prog->aux->attach_func_proto;
3aac1ead5eb6b76f Toke Høiland-Jørgensen 2020-09-29  4582  	struct bpf_prog *tgt_prog = prog->aux->dst_prog;
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4583  	struct btf *btf = bpf_prog_get_target_btf(prog);
3820729160440158 Martin KaFai Lau       2019-10-24  4584  	const char *tname = prog->aux->attach_func_name;
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4585  	struct bpf_verifier_log *log = info->log;
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4586  	const struct btf_param *args;
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4587  	u32 nr_args, arg;
3c32cc1bceba8a17 Yonghong Song          2020-05-13  4588  	int i, ret;
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4589  
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4590  	if (off % 8) {
3820729160440158 Martin KaFai Lau       2019-10-24  4591  		bpf_log(log, "func '%s' offset %d is not multiple of 8\n",
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4592  			tname, off);
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4593  		return false;
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4594  	}
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4595  	arg = off / 8;
9e15db66136a14cd Alexei Starovoitov     2019-10-15 @4596  	args = (const struct btf_param *)(t + 1);
523a4cf491b3c9e2 Dmitrii Banshchikov    2021-02-26  4597  	/* if (t == NULL) Fall back to default BPF prog with
523a4cf491b3c9e2 Dmitrii Banshchikov    2021-02-26  4598  	 * MAX_BPF_FUNC_REG_ARGS u64 arguments.
523a4cf491b3c9e2 Dmitrii Banshchikov    2021-02-26  4599  	 */
523a4cf491b3c9e2 Dmitrii Banshchikov    2021-02-26  4600  	nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
3820729160440158 Martin KaFai Lau       2019-10-24  4601  	if (prog->aux->attach_btf_trace) {
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4602  		/* skip first 'void *__data' argument in btf_trace_##name typedef */
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4603  		args++;
3820729160440158 Martin KaFai Lau       2019-10-24  4604  		nr_args--;
3820729160440158 Martin KaFai Lau       2019-10-24  4605  	}
fec56f5890d93fc2 Alexei Starovoitov     2019-11-14  4606  
f50b49a0bfcaf53e KP Singh               2020-03-30  4607  	if (arg > nr_args) {
f50b49a0bfcaf53e KP Singh               2020-03-30  4608  		bpf_log(log, "func '%s' doesn't have %d-th argument\n",
f50b49a0bfcaf53e KP Singh               2020-03-30  4609  			tname, arg + 1);
f50b49a0bfcaf53e KP Singh               2020-03-30  4610  		return false;
f50b49a0bfcaf53e KP Singh               2020-03-30  4611  	}
f50b49a0bfcaf53e KP Singh               2020-03-30  4612  
6ba43b761c413491 KP Singh               2020-03-04  4613  	if (arg == nr_args) {
f50b49a0bfcaf53e KP Singh               2020-03-30  4614  		switch (prog->expected_attach_type) {
f50b49a0bfcaf53e KP Singh               2020-03-30  4615  		case BPF_LSM_MAC:
f50b49a0bfcaf53e KP Singh               2020-03-30  4616  		case BPF_TRACE_FEXIT:
9e4e01dfd3254c7f KP Singh               2020-03-29  4617  			/* When LSM programs are attached to void LSM hooks
9e4e01dfd3254c7f KP Singh               2020-03-29  4618  			 * they use FEXIT trampolines and when attached to
9e4e01dfd3254c7f KP Singh               2020-03-29  4619  			 * int LSM hooks, they use MODIFY_RETURN trampolines.
9e4e01dfd3254c7f KP Singh               2020-03-29  4620  			 *
9e4e01dfd3254c7f KP Singh               2020-03-29  4621  			 * While the LSM programs are BPF_MODIFY_RETURN-like
9e4e01dfd3254c7f KP Singh               2020-03-29  4622  			 * the check:
9e4e01dfd3254c7f KP Singh               2020-03-29  4623  			 *
9e4e01dfd3254c7f KP Singh               2020-03-29  4624  			 *	if (ret_type != 'int')
9e4e01dfd3254c7f KP Singh               2020-03-29  4625  			 *		return -EINVAL;
9e4e01dfd3254c7f KP Singh               2020-03-29  4626  			 *
9e4e01dfd3254c7f KP Singh               2020-03-29  4627  			 * is _not_ done here. This is still safe as LSM hooks
9e4e01dfd3254c7f KP Singh               2020-03-29  4628  			 * have only void and int return types.
9e4e01dfd3254c7f KP Singh               2020-03-29  4629  			 */
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4630  			if (!t)
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4631  				return true;
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4632  			t = btf_type_by_id(btf, t->type);
f50b49a0bfcaf53e KP Singh               2020-03-30  4633  			break;
f50b49a0bfcaf53e KP Singh               2020-03-30  4634  		case BPF_MODIFY_RETURN:
6ba43b761c413491 KP Singh               2020-03-04  4635  			/* For now the BPF_MODIFY_RETURN can only be attached to
6ba43b761c413491 KP Singh               2020-03-04  4636  			 * functions that return an int.
6ba43b761c413491 KP Singh               2020-03-04  4637  			 */
6ba43b761c413491 KP Singh               2020-03-04  4638  			if (!t)
6ba43b761c413491 KP Singh               2020-03-04  4639  				return false;
6ba43b761c413491 KP Singh               2020-03-04  4640  
6ba43b761c413491 KP Singh               2020-03-04  4641  			t = btf_type_skip_modifiers(btf, t->type, NULL);
a9b59159d338d414 John Fastabend         2020-06-24  4642  			if (!btf_type_is_small_int(t)) {
6ba43b761c413491 KP Singh               2020-03-04  4643  				bpf_log(log,
6ba43b761c413491 KP Singh               2020-03-04  4644  					"ret type %s not allowed for fmod_ret\n",
6ba43b761c413491 KP Singh               2020-03-04  4645  					btf_kind_str[BTF_INFO_KIND(t->info)]);
6ba43b761c413491 KP Singh               2020-03-04  4646  				return false;
6ba43b761c413491 KP Singh               2020-03-04  4647  			}
f50b49a0bfcaf53e KP Singh               2020-03-30  4648  			break;
f50b49a0bfcaf53e KP Singh               2020-03-30  4649  		default:
3820729160440158 Martin KaFai Lau       2019-10-24  4650  			bpf_log(log, "func '%s' doesn't have %d-th argument\n",
fec56f5890d93fc2 Alexei Starovoitov     2019-11-14  4651  				tname, arg + 1);
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4652  			return false;
f50b49a0bfcaf53e KP Singh               2020-03-30  4653  		}
fec56f5890d93fc2 Alexei Starovoitov     2019-11-14  4654  	} else {
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4655  		if (!t)
523a4cf491b3c9e2 Dmitrii Banshchikov    2021-02-26  4656  			/* Default prog with MAX_BPF_FUNC_REG_ARGS args */
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4657  			return true;
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4658  		t = btf_type_by_id(btf, args[arg].type);
fec56f5890d93fc2 Alexei Starovoitov     2019-11-14  4659  	}
f50b49a0bfcaf53e KP Singh               2020-03-30  4660  
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4661  	/* skip modifiers */
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4662  	while (btf_type_is_modifier(t))
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4663  		t = btf_type_by_id(btf, t->type);
a9b59159d338d414 John Fastabend         2020-06-24  4664  	if (btf_type_is_small_int(t) || btf_type_is_enum(t))
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4665  		/* accessing a scalar */
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4666  		return true;
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4667  	if (!btf_type_is_ptr(t)) {
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4668  		bpf_log(log,
3820729160440158 Martin KaFai Lau       2019-10-24  4669  			"func '%s' arg%d '%s' has type %s. Only pointer access is allowed\n",
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4670  			tname, arg,
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4671  			__btf_name_by_offset(btf, t->name_off),
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4672  			btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4673  		return false;
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4674  	}
afbf21dce668ef59 Yonghong Song          2020-07-23  4675  
afbf21dce668ef59 Yonghong Song          2020-07-23  4676  	/* check for PTR_TO_RDONLY_BUF_OR_NULL or PTR_TO_RDWR_BUF_OR_NULL */
afbf21dce668ef59 Yonghong Song          2020-07-23  4677  	for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
afbf21dce668ef59 Yonghong Song          2020-07-23  4678  		const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
afbf21dce668ef59 Yonghong Song          2020-07-23  4679  
afbf21dce668ef59 Yonghong Song          2020-07-23  4680  		if (ctx_arg_info->offset == off &&
afbf21dce668ef59 Yonghong Song          2020-07-23  4681  		    (ctx_arg_info->reg_type == PTR_TO_RDONLY_BUF_OR_NULL ||
afbf21dce668ef59 Yonghong Song          2020-07-23  4682  		     ctx_arg_info->reg_type == PTR_TO_RDWR_BUF_OR_NULL)) {
afbf21dce668ef59 Yonghong Song          2020-07-23  4683  			info->reg_type = ctx_arg_info->reg_type;
afbf21dce668ef59 Yonghong Song          2020-07-23  4684  			return true;
afbf21dce668ef59 Yonghong Song          2020-07-23  4685  		}
afbf21dce668ef59 Yonghong Song          2020-07-23  4686  	}
afbf21dce668ef59 Yonghong Song          2020-07-23  4687  
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4688  	if (t->type == 0)
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4689  		/* This is a pointer to void.
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4690  		 * It is the same as scalar from the verifier safety pov.
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4691  		 * No further pointer walking is allowed.
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4692  		 */
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4693  		return true;
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4694  
84ad7a7ab69f112c Jiri Olsa              2020-01-23  4695  	if (is_string_ptr(btf, t))
84ad7a7ab69f112c Jiri Olsa              2020-01-23  4696  		return true;
84ad7a7ab69f112c Jiri Olsa              2020-01-23  4697  
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4698  	/* this is a pointer to another type */
3c32cc1bceba8a17 Yonghong Song          2020-05-13  4699  	for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
3c32cc1bceba8a17 Yonghong Song          2020-05-13  4700  		const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
3c32cc1bceba8a17 Yonghong Song          2020-05-13  4701  
3c32cc1bceba8a17 Yonghong Song          2020-05-13  4702  		if (ctx_arg_info->offset == off) {
3c32cc1bceba8a17 Yonghong Song          2020-05-13  4703  			info->reg_type = ctx_arg_info->reg_type;
22dc4a0f5ed11b6d Andrii Nakryiko        2020-12-03  4704  			info->btf = btf_vmlinux;
951cf368bcb11d6f Yonghong Song          2020-07-20  4705  			info->btf_id = ctx_arg_info->btf_id;
951cf368bcb11d6f Yonghong Song          2020-07-20  4706  			return true;
3c32cc1bceba8a17 Yonghong Song          2020-05-13  4707  		}
3c32cc1bceba8a17 Yonghong Song          2020-05-13  4708  	}
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4709  
951cf368bcb11d6f Yonghong Song          2020-07-20  4710  	info->reg_type = PTR_TO_BTF_ID;
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4711  	if (tgt_prog) {
43bc2874e779c179 Toke Høiland-Jørgensen 2020-09-29  4712  		enum bpf_prog_type tgt_type;
43bc2874e779c179 Toke Høiland-Jørgensen 2020-09-29  4713  
43bc2874e779c179 Toke Høiland-Jørgensen 2020-09-29  4714  		if (tgt_prog->type == BPF_PROG_TYPE_EXT)
43bc2874e779c179 Toke Høiland-Jørgensen 2020-09-29  4715  			tgt_type = tgt_prog->aux->saved_dst_prog_type;
43bc2874e779c179 Toke Høiland-Jørgensen 2020-09-29  4716  		else
43bc2874e779c179 Toke Høiland-Jørgensen 2020-09-29  4717  			tgt_type = tgt_prog->type;
43bc2874e779c179 Toke Høiland-Jørgensen 2020-09-29  4718  
43bc2874e779c179 Toke Høiland-Jørgensen 2020-09-29  4719  		ret = btf_translate_to_vmlinux(log, btf, t, tgt_type, arg);
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4720  		if (ret > 0) {
22dc4a0f5ed11b6d Andrii Nakryiko        2020-12-03  4721  			info->btf = btf_vmlinux;
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4722  			info->btf_id = ret;
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4723  			return true;
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4724  		} else {
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4725  			return false;
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4726  		}
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4727  	}
275517ff452a535d Martin KaFai Lau       2020-01-08  4728  
22dc4a0f5ed11b6d Andrii Nakryiko        2020-12-03  4729  	info->btf = btf;
275517ff452a535d Martin KaFai Lau       2020-01-08  4730  	info->btf_id = t->type;
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4731  	t = btf_type_by_id(btf, t->type);
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4732  	/* skip modifiers */
275517ff452a535d Martin KaFai Lau       2020-01-08  4733  	while (btf_type_is_modifier(t)) {
275517ff452a535d Martin KaFai Lau       2020-01-08  4734  		info->btf_id = t->type;
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4735  		t = btf_type_by_id(btf, t->type);
275517ff452a535d Martin KaFai Lau       2020-01-08  4736  	}
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4737  	if (!btf_type_is_struct(t)) {
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4738  		bpf_log(log,
3820729160440158 Martin KaFai Lau       2019-10-24  4739  			"func '%s' arg%d type %s is not a struct\n",
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4740  			tname, arg, btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4741  		return false;
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4742  	}
3820729160440158 Martin KaFai Lau       2019-10-24  4743  	bpf_log(log, "func '%s' arg%d has btf_id %d type %s '%s'\n",
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4744  		tname, arg, info->btf_id, btf_kind_str[BTF_INFO_KIND(t->info)],
5b92a28aae4dd0f8 Alexei Starovoitov     2019-11-14  4745  		__btf_name_by_offset(btf, t->name_off));
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4746  	return true;
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4747  }
9e15db66136a14cd Alexei Starovoitov     2019-10-15  4748  

:::::: The code at line 4596 was first introduced by commit
:::::: 9e15db66136a14cde3f35691f1d839d950118826 bpf: Implement accurate raw_tp context access via BTF

:::::: TO: Alexei Starovoitov <ast@kernel.org>
:::::: CC: Daniel Borkmann <daniel@iogearbox.net>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-01-19 20:13 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-28 21:42 kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck] kernel test robot
2021-08-29  7:30 ` kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2022-01-19 20:13 kernel test robot
2021-12-07  2:22 kernel test robot
2021-06-24  3:26 kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.