Commit 7cb29b1c authored by Kumar Kartikeya Dwivedi's avatar Kumar Kartikeya Dwivedi Committed by Alexei Starovoitov
Browse files

selftests/bpf: Test passing rdonly mem to global func



Add two test cases, one pass read only map value pointer to global
func, which should be rejected. The same code checks it for kfunc, so
that is covered as well. Second one tries to use the missing check for
PTR_TO_MEM's MEM_RDONLY flag and tries to write to a read only memory
pointer. Without prior patches, both of these tests fail.

Reviewed-by: default avatarHao Luo <haoluo@google.com>
Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20220319080827.73251-5-memxor@gmail.com


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 7b3552d3
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -138,12 +138,16 @@ static void test_weak_syms_lskel(void)
	test_ksyms_weak_lskel__destroy(skel);
}

static void test_write_check(void)
static void test_write_check(bool test_handler1)
{
	struct test_ksyms_btf_write_check *skel;

	skel = test_ksyms_btf_write_check__open_and_load();
	ASSERT_ERR_PTR(skel, "unexpected load of a prog writing to ksym memory\n");
	skel = test_ksyms_btf_write_check__open();
	if (!ASSERT_OK_PTR(skel, "test_ksyms_btf_write_check__open"))
		return;
	bpf_program__set_autoload(test_handler1 ? skel->progs.handler2 : skel->progs.handler1, false);
	ASSERT_ERR(test_ksyms_btf_write_check__load(skel),
		   "unexpected load of a prog writing to ksym memory\n");

	test_ksyms_btf_write_check__destroy(skel);
}
@@ -179,6 +183,9 @@ void test_ksyms_btf(void)
	if (test__start_subtest("weak_ksyms_lskel"))
		test_weak_syms_lskel();

	if (test__start_subtest("write_check"))
		test_write_check();
	if (test__start_subtest("write_check1"))
		test_write_check(true);

	if (test__start_subtest("write_check2"))
		test_write_check(false);
}
+1 −0
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ void test_test_global_funcs(void)
		{ "test_global_func14.o", "reference type('FWD S') size cannot be determined" },
		{ "test_global_func15.o", "At program exit the register R0 has value" },
		{ "test_global_func16.o", "invalid indirect read from stack" },
		{ "test_global_func17.o", "Caller passes invalid args into func#1" },
	};
	libbpf_print_fn_t old_print_fn = NULL;
	int err, i, duration = 0;
+16 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
#include <vmlinux.h>
#include <bpf/bpf_helpers.h>

__noinline int foo(int *p)
{
	return p ? (*p = 42) : 0;
}

const volatile int i;

SEC("tc")
int test_cls(struct __sk_buff *skb)
{
	return foo((int *)&i);
}
+17 −1
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@
extern const int bpf_prog_active __ksym; /* int type global var. */

SEC("raw_tp/sys_enter")
int handler(const void *ctx)
int handler1(const void *ctx)
{
	int *active;
	__u32 cpu;
@@ -26,4 +26,20 @@ int handler(const void *ctx)
	return 0;
}

__noinline int write_active(int *p)
{
	return p ? (*p = 42) : 0;
}

SEC("raw_tp/sys_enter")
int handler2(const void *ctx)
{
	int *active;
	__u32 cpu;

	active = bpf_this_cpu_ptr(&bpf_prog_active);
	write_active(active);
	return 0;
}

char _license[] SEC("license") = "GPL";