2022-07-01 13:27:02

by Po-Hsu Lin

[permalink] [raw]
Subject: [PATCH stable 5.15 1/1] selftests/bpf: Add test_verifier support to fixup kfunc call insns

From: Kumar Kartikeya Dwivedi <[email protected]>

commit 0201b80772ac2b712bbbfe783cdb731fdfb4247e upstream.

This allows us to add tests (esp. negative tests) where we only want to
ensure the program doesn't pass through the verifier, and also verify
the error. The next commit will add the tests making use of this.

Signed-off-by: Kumar Kartikeya Dwivedi <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Alexei Starovoitov <[email protected]>
[PHLin: backport due to lack of fixup_map_timer]
Signed-off-by: Po-Hsu Lin <[email protected]>
---
tools/testing/selftests/bpf/test_verifier.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)

diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
index 3a9e332..68a9a89 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -31,6 +31,7 @@
#include <linux/if_ether.h>
#include <linux/btf.h>

+#include <bpf/btf.h>
#include <bpf/bpf.h>
#include <bpf/libbpf.h>

@@ -63,6 +64,11 @@ static bool unpriv_disabled = false;
static int skips;
static bool verbose = false;

+struct kfunc_btf_id_pair {
+ const char *kfunc;
+ int insn_idx;
+};
+
struct bpf_test {
const char *descr;
struct bpf_insn insns[MAX_INSNS];
@@ -88,6 +94,7 @@ struct bpf_test {
int fixup_map_event_output[MAX_FIXUPS];
int fixup_map_reuseport_array[MAX_FIXUPS];
int fixup_map_ringbuf[MAX_FIXUPS];
+ struct kfunc_btf_id_pair fixup_kfunc_btf_id[MAX_FIXUPS];
/* Expected verifier log output for result REJECT or VERBOSE_ACCEPT.
* Can be a tab-separated sequence of expected strings. An empty string
* means no log verification.
@@ -718,6 +725,7 @@ static void do_test_fixup(struct bpf_test *test, enum bpf_prog_type prog_type,
int *fixup_map_event_output = test->fixup_map_event_output;
int *fixup_map_reuseport_array = test->fixup_map_reuseport_array;
int *fixup_map_ringbuf = test->fixup_map_ringbuf;
+ struct kfunc_btf_id_pair *fixup_kfunc_btf_id = test->fixup_kfunc_btf_id;

if (test->fill_helper) {
test->fill_insns = calloc(MAX_TEST_INSNS, sizeof(struct bpf_insn));
@@ -903,6 +911,26 @@ static void do_test_fixup(struct bpf_test *test, enum bpf_prog_type prog_type,
fixup_map_ringbuf++;
} while (*fixup_map_ringbuf);
}
+
+ /* Patch in kfunc BTF IDs */
+ if (fixup_kfunc_btf_id->kfunc) {
+ struct btf *btf;
+ int btf_id;
+
+ do {
+ btf_id = 0;
+ btf = btf__load_vmlinux_btf();
+ if (btf) {
+ btf_id = btf__find_by_name_kind(btf,
+ fixup_kfunc_btf_id->kfunc,
+ BTF_KIND_FUNC);
+ btf_id = btf_id < 0 ? 0 : btf_id;
+ }
+ btf__free(btf);
+ prog[fixup_kfunc_btf_id->insn_idx].imm = btf_id;
+ fixup_kfunc_btf_id++;
+ } while (fixup_kfunc_btf_id->kfunc);
+ }
}

struct libcap {
--
2.7.4


2022-07-04 14:55:07

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH stable 5.15 1/1] selftests/bpf: Add test_verifier support to fixup kfunc call insns

On Fri, Jul 01, 2022 at 09:08:58PM +0800, Po-Hsu Lin wrote:
> From: Kumar Kartikeya Dwivedi <[email protected]>
>
> commit 0201b80772ac2b712bbbfe783cdb731fdfb4247e upstream.
>
> This allows us to add tests (esp. negative tests) where we only want to
> ensure the program doesn't pass through the verifier, and also verify
> the error. The next commit will add the tests making use of this.
>
> Signed-off-by: Kumar Kartikeya Dwivedi <[email protected]>
> Link: https://lore.kernel.org/r/[email protected]
> Signed-off-by: Alexei Starovoitov <[email protected]>
> [PHLin: backport due to lack of fixup_map_timer]
> Signed-off-by: Po-Hsu Lin <[email protected]>
> ---
> tools/testing/selftests/bpf/test_verifier.c | 28 ++++++++++++++++++++++++++++
> 1 file changed, 28 insertions(+)

Now queued up, thanks.

greg k-h