From: Matteo Croce <mcroce@linux.microsoft.com>
To: Alexei Starovoitov <alexei.starovoitov@gmail.com>, bpf@vger.kernel.org
Cc: Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>,
linux-kernel@vger.kernel.org
Subject: [PATCH bpf-next v3 2/2] selftests/bpf: test maximum recursion depth for bpf_core_types_are_compat()
Date: Fri, 4 Feb 2022 01:55:19 +0100 [thread overview]
Message-ID: <20220204005519.60361-3-mcroce@linux.microsoft.com> (raw)
In-Reply-To: <20220204005519.60361-1-mcroce@linux.microsoft.com>
From: Matteo Croce <mcroce@microsoft.com>
bpf_core_types_are_compat() was limited to 2 recursion levels, which are
enough to parse a function prototype.
Add a test which checks the existence of a function prototype, so to
test the bpf_core_types_are_compat() code path.
The test for the recursion limit being hit is done in a separate object,
because the kernel failure makes the whole load to fail.
Sample run log with extra prints:
[ 5689.913751] bpf_core_apply_relo_insn:1200 cands->len: 2
[ 5689.913902] bpf_core_types_are_compat:6896: ret: 1
[ 5689.913994] bpf_core_types_are_compat:6896: ret: 0
[ 5689.914025] bpf_core_apply_relo_insn:1200 cands->len: 2
[ 5689.914141] bpf_core_types_are_compat:6896: ret: 0
[ 5689.914246] bpf_core_types_are_compat:6896: ret: 0
test_core_kern_lskel:PASS:open_and_load 0 nsec
test_core_kern_lskel:PASS:attach(core_relo_proto) 0 nsec
test_core_kern_lskel:PASS:bpf_core_type_exists 0 nsec
test_core_kern_lskel:PASS:!bpf_core_type_exists 0 nsec
#41 core_kern_lskel:OK
[ 5689.915267] bpf_core_apply_relo_insn:1200 cands->len: 2
[ 5689.915399] bpf_core_types_are_compat:6896: ret: 0
[ 5689.915504] bpf_core_types_are_compat:6896: ret: -22
test_core_kern_overflow_lskel:PASS:open_and_load 0 nsec
#42 core_kern_overflow_lskel:OK
Summary: 2/0 PASSED, 0 SKIPPED, 0 FAILED
Successfully unloaded bpf_testmod.ko.
Signed-off-by: Matteo Croce <mcroce@microsoft.com>
---
tools/testing/selftests/bpf/Makefile | 2 +-
.../selftests/bpf/bpf_testmod/bpf_testmod.c | 5 +++++
.../selftests/bpf/prog_tests/core_kern.c | 15 ++++++++++++-
.../bpf/prog_tests/core_kern_overflow.c | 13 ++++++++++++
tools/testing/selftests/bpf/progs/core_kern.c | 14 +++++++++++++
.../selftests/bpf/progs/core_kern_overflow.c | 21 +++++++++++++++++++
6 files changed, 68 insertions(+), 2 deletions(-)
create mode 100644 tools/testing/selftests/bpf/prog_tests/core_kern_overflow.c
create mode 100644 tools/testing/selftests/bpf/progs/core_kern_overflow.c
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index 945f92d71db3..91ea729990da 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -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)
diff --git a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
index 595d32ab285a..e5ba8d8a17da 100644
--- a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
+++ b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
@@ -13,6 +13,11 @@
#define CREATE_TRACE_POINTS
#include "bpf_testmod-events.h"
+typedef int (*func_proto_typedef___match)(long);
+typedef int (*func_proto_typedef___overflow)(func_proto_typedef___match);
+func_proto_typedef___match funcp = NULL;
+func_proto_typedef___overflow funcp_of = NULL;
+
DEFINE_PER_CPU(int, bpf_testmod_ksym_percpu) = 123;
noinline void
diff --git a/tools/testing/selftests/bpf/prog_tests/core_kern.c b/tools/testing/selftests/bpf/prog_tests/core_kern.c
index 561c5185d886..91493f5836ff 100644
--- a/tools/testing/selftests/bpf/prog_tests/core_kern.c
+++ b/tools/testing/selftests/bpf/prog_tests/core_kern.c
@@ -7,8 +7,21 @@
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");
+
+cleanup:
core_kern_lskel__destroy(skel);
}
diff --git a/tools/testing/selftests/bpf/prog_tests/core_kern_overflow.c b/tools/testing/selftests/bpf/prog_tests/core_kern_overflow.c
new file mode 100644
index 000000000000..04cc145bc26a
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/core_kern_overflow.c
@@ -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);
+}
diff --git a/tools/testing/selftests/bpf/progs/core_kern.c b/tools/testing/selftests/bpf/progs/core_kern.c
index 13499cc15c7d..acabe4cb0480 100644
--- a/tools/testing/selftests/bpf/progs/core_kern.c
+++ b/tools/testing/selftests/bpf/progs/core_kern.c
@@ -101,4 +101,18 @@ int balancer_ingress(struct __sk_buff *ctx)
return 0;
}
+typedef int (*func_proto_typedef___match)(long);
+typedef void (*func_proto_typedef___doesnt_match)(char*);
+
+int proto_out[2];
+
+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);
+
+ return 0;
+}
+
char LICENSE[] SEC("license") = "GPL";
diff --git a/tools/testing/selftests/bpf/progs/core_kern_overflow.c b/tools/testing/selftests/bpf/progs/core_kern_overflow.c
new file mode 100644
index 000000000000..70417413af55
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/core_kern_overflow.c
@@ -0,0 +1,21 @@
+// 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___match)(long);
+typedef int (*func_proto_typedef___overflow)(func_proto_typedef___match);
+
+int proto_out;
+
+SEC("raw_tracepoint/sys_enter")
+int core_relo_proto(void *ctx)
+{
+ proto_out = bpf_core_type_exists(func_proto_typedef___overflow);
+
+ return 0;
+}
+
+char LICENSE[] SEC("license") = "GPL";
--
2.34.1
next prev parent reply other threads:[~2022-02-04 0:55 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-04 0:55 [PATCH bpf-next v3 0/2] limit bpf_core_types_are_compat recursion Matteo Croce
2022-02-04 0:55 ` [PATCH bpf-next v3 1/2] bpf: limit bpf_core_types_are_compat() recursion Matteo Croce
2022-02-04 19:32 ` Alexei Starovoitov
2022-02-04 0:55 ` Matteo Croce [this message]
2022-02-04 19:37 ` [PATCH bpf-next v3 2/2] selftests/bpf: test maximum recursion depth for bpf_core_types_are_compat() Alexei Starovoitov
2022-02-06 22:27 ` Matteo Croce
2022-02-04 19:40 ` [PATCH bpf-next v3 0/2] limit bpf_core_types_are_compat recursion patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220204005519.60361-3-mcroce@linux.microsoft.com \
--to=mcroce@linux.microsoft.com \
--cc=alexei.starovoitov@gmail.com \
--cc=andrii@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.