Commit 30bbfe32 authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Alexei Starovoitov
Browse files

selftests/bpf: add missing __weak kfunc log fixup test



Add test validating that libbpf correctly poisons and reports __weak
unresolved kfuncs in post-processed verifier log.

Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20230418002148.3255690-5-andrii@kernel.org


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 05b6f766
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -135,6 +135,35 @@ static void missing_map(void)
	test_log_fixup__destroy(skel);
}

static void missing_kfunc(void)
{
	char log_buf[8 * 1024];
	struct test_log_fixup* skel;
	int err;

	skel = test_log_fixup__open();
	if (!ASSERT_OK_PTR(skel, "skel_open"))
		return;

	bpf_program__set_autoload(skel->progs.use_missing_kfunc, true);
	bpf_program__set_log_buf(skel->progs.use_missing_kfunc, log_buf, sizeof(log_buf));

	err = test_log_fixup__load(skel);
	if (!ASSERT_ERR(err, "load_fail"))
		goto cleanup;

	ASSERT_HAS_SUBSTR(log_buf,
			  "0: <invalid kfunc call>\n"
			  "kfunc 'bpf_nonexistent_kfunc' is referenced but wasn't resolved\n",
			  "log_buf");

	if (env.verbosity > VERBOSE_NONE)
		printf("LOG:   \n=================\n%s=================\n", log_buf);

cleanup:
	test_log_fixup__destroy(skel);
}

void test_log_fixup(void)
{
	if (test__start_subtest("bad_core_relo_trunc_none"))
@@ -147,4 +176,6 @@ void test_log_fixup(void)
		bad_core_relo_subprog();
	if (test__start_subtest("missing_map"))
		missing_map();
	if (test__start_subtest("missing_kfunc"))
		missing_kfunc();
}
+10 −0
Original line number Diff line number Diff line
@@ -61,4 +61,14 @@ int use_missing_map(const void *ctx)
	return value != NULL;
}

extern int bpf_nonexistent_kfunc(void) __ksym __weak;

SEC("?raw_tp/sys_enter")
int use_missing_kfunc(const void *ctx)
{
	bpf_nonexistent_kfunc();

	return 0;
}

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