selftests/bpf: Test bpf_core_types_are_compat() functionality.
Add several tests to check bpf_core_types_are_compat() functionality: - candidate type name exists and types match - candidate type name exists but types don't match - nested func protos at kernel recursion limit - nested func protos above kernel recursion limit. Such bpf prog is rejected during the load. Signed-off-by: Matteo Croce <mcroce@microsoft.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20220204005519.60361-3-mcroce@linux.microsoft.com
This commit is contained in:
parent
e70e13e7d4
commit
976a38e05a
@ -330,7 +330,7 @@ LINKED_SKELS := test_static_linked.skel.h linked_funcs.skel.h \
|
||||
|
||||
LSKELS := kfunc_call_test.c fentry_test.c fexit_test.c fexit_sleep.c \
|
||||
test_ringbuf.c atomics.c trace_printk.c trace_vprintk.c \
|
||||
map_ptr_kern.c core_kern.c
|
||||
map_ptr_kern.c core_kern.c core_kern_overflow.c
|
||||
# Generate both light skeleton and libbpf skeleton for these
|
||||
LSKELS_EXTRA := test_ksyms_module.c test_ksyms_weak.c kfunc_call_test_subprog.c
|
||||
SKEL_BLACKLIST += $$(LSKELS)
|
||||
|
@ -13,6 +13,10 @@
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include "bpf_testmod-events.h"
|
||||
|
||||
typedef int (*func_proto_typedef)(long);
|
||||
typedef int (*func_proto_typedef_nested1)(func_proto_typedef);
|
||||
typedef int (*func_proto_typedef_nested2)(func_proto_typedef_nested1);
|
||||
|
||||
DEFINE_PER_CPU(int, bpf_testmod_ksym_percpu) = 123;
|
||||
|
||||
noinline void
|
||||
@ -31,6 +35,9 @@ struct bpf_testmod_btf_type_tag_2 {
|
||||
|
||||
noinline int
|
||||
bpf_testmod_test_btf_type_tag_user_1(struct bpf_testmod_btf_type_tag_1 __user *arg) {
|
||||
BTF_TYPE_EMIT(func_proto_typedef);
|
||||
BTF_TYPE_EMIT(func_proto_typedef_nested1);
|
||||
BTF_TYPE_EMIT(func_proto_typedef_nested2);
|
||||
return arg->a;
|
||||
}
|
||||
|
||||
|
@ -7,8 +7,22 @@
|
||||
void test_core_kern_lskel(void)
|
||||
{
|
||||
struct core_kern_lskel *skel;
|
||||
int link_fd;
|
||||
|
||||
skel = core_kern_lskel__open_and_load();
|
||||
ASSERT_OK_PTR(skel, "open_and_load");
|
||||
if (!ASSERT_OK_PTR(skel, "open_and_load"))
|
||||
return;
|
||||
|
||||
link_fd = core_kern_lskel__core_relo_proto__attach(skel);
|
||||
if (!ASSERT_GT(link_fd, 0, "attach(core_relo_proto)"))
|
||||
goto cleanup;
|
||||
|
||||
/* trigger tracepoints */
|
||||
usleep(1);
|
||||
ASSERT_TRUE(skel->bss->proto_out[0], "bpf_core_type_exists");
|
||||
ASSERT_FALSE(skel->bss->proto_out[1], "!bpf_core_type_exists");
|
||||
ASSERT_TRUE(skel->bss->proto_out[2], "bpf_core_type_exists. nested");
|
||||
|
||||
cleanup:
|
||||
core_kern_lskel__destroy(skel);
|
||||
}
|
||||
|
13
tools/testing/selftests/bpf/prog_tests/core_kern_overflow.c
Normal file
13
tools/testing/selftests/bpf/prog_tests/core_kern_overflow.c
Normal file
@ -0,0 +1,13 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include "test_progs.h"
|
||||
#include "core_kern_overflow.lskel.h"
|
||||
|
||||
void test_core_kern_overflow_lskel(void)
|
||||
{
|
||||
struct core_kern_overflow_lskel *skel;
|
||||
|
||||
skel = core_kern_overflow_lskel__open_and_load();
|
||||
if (!ASSERT_NULL(skel, "open_and_load"))
|
||||
core_kern_overflow_lskel__destroy(skel);
|
||||
}
|
@ -101,4 +101,20 @@ int balancer_ingress(struct __sk_buff *ctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
typedef int (*func_proto_typedef___match)(long);
|
||||
typedef int (*func_proto_typedef___doesnt_match)(char *);
|
||||
typedef int (*func_proto_typedef_nested1)(func_proto_typedef___match);
|
||||
|
||||
int proto_out[3];
|
||||
|
||||
SEC("raw_tracepoint/sys_enter")
|
||||
int core_relo_proto(void *ctx)
|
||||
{
|
||||
proto_out[0] = bpf_core_type_exists(func_proto_typedef___match);
|
||||
proto_out[1] = bpf_core_type_exists(func_proto_typedef___doesnt_match);
|
||||
proto_out[2] = bpf_core_type_exists(func_proto_typedef_nested1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char LICENSE[] SEC("license") = "GPL";
|
||||
|
22
tools/testing/selftests/bpf/progs/core_kern_overflow.c
Normal file
22
tools/testing/selftests/bpf/progs/core_kern_overflow.c
Normal file
@ -0,0 +1,22 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include "vmlinux.h"
|
||||
|
||||
#include <bpf/bpf_helpers.h>
|
||||
#include <bpf/bpf_tracing.h>
|
||||
#include <bpf/bpf_core_read.h>
|
||||
|
||||
typedef int (*func_proto_typedef)(long);
|
||||
typedef int (*func_proto_typedef_nested1)(func_proto_typedef);
|
||||
typedef int (*func_proto_typedef_nested2)(func_proto_typedef_nested1);
|
||||
|
||||
int proto_out;
|
||||
|
||||
SEC("raw_tracepoint/sys_enter")
|
||||
int core_relo_proto(void *ctx)
|
||||
{
|
||||
proto_out = bpf_core_type_exists(func_proto_typedef_nested2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char LICENSE[] SEC("license") = "GPL";
|
Loading…
x
Reference in New Issue
Block a user