diff options
author | Dmitrii Banshchikov <me@ubique.spb.ru> | 2020-11-13 17:17:56 +0000 |
---|---|---|
committer | Alexei Starovoitov <ast@kernel.org> | 2020-11-14 08:17:27 -0800 |
commit | f782e2c300a717233b64697affda3ea7aac00b2b (patch) | |
tree | 7fa16ea50da2ef7daa298a339b156ef137224861 /tools/testing/selftests/bpf/progs/test_global_func8.c | |
parent | 50431b45685b600fc2851a3f2b53e24643efe6d3 (diff) | |
download | linux-f782e2c300a717233b64697affda3ea7aac00b2b.tar.gz linux-f782e2c300a717233b64697affda3ea7aac00b2b.tar.bz2 linux-f782e2c300a717233b64697affda3ea7aac00b2b.zip |
bpf: Relax return code check for subprograms
Currently verifier enforces return code checks for subprograms in the
same manner as it does for program entry points. This prevents returning
arbitrary scalar values from subprograms. Scalar type of returned values
is checked by btf_prepare_func_args() and hence it should be safe to
allow only scalars for now. Relax return code checks for subprograms and
allow any correct scalar values.
Fixes: 51c39bb1d5d10 (bpf: Introduce function-by-function verification)
Signed-off-by: Dmitrii Banshchikov <me@ubique.spb.ru>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20201113171756.90594-1-me@ubique.spb.ru
Diffstat (limited to 'tools/testing/selftests/bpf/progs/test_global_func8.c')
-rw-r--r-- | tools/testing/selftests/bpf/progs/test_global_func8.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/progs/test_global_func8.c b/tools/testing/selftests/bpf/progs/test_global_func8.c new file mode 100644 index 000000000000..d55a6544b1ab --- /dev/null +++ b/tools/testing/selftests/bpf/progs/test_global_func8.c @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright (c) 2020 Facebook */ +#include <stddef.h> +#include <linux/bpf.h> +#include <bpf/bpf_helpers.h> + +__noinline int foo(struct __sk_buff *skb) +{ + return bpf_get_prandom_u32(); +} + +SEC("cgroup_skb/ingress") +int test_cls(struct __sk_buff *skb) +{ + if (!foo(skb)) + return 0; + + return 1; +} |