diff options
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests/probe_read_user_str.c')
| -rw-r--r-- | tools/testing/selftests/bpf/prog_tests/probe_read_user_str.c | 71 | 
1 files changed, 71 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/probe_read_user_str.c b/tools/testing/selftests/bpf/prog_tests/probe_read_user_str.c new file mode 100644 index 000000000000..e419298132b5 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/probe_read_user_str.c @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <test_progs.h> +#include "test_probe_read_user_str.skel.h" + +static const char str1[] = "mestring"; +static const char str2[] = "mestringalittlebigger"; +static const char str3[] = "mestringblubblubblubblubblub"; + +static int test_one_str(struct test_probe_read_user_str *skel, const char *str, +			size_t len) +{ +	int err, duration = 0; +	char buf[256]; + +	/* Ensure bytes after string are ones */ +	memset(buf, 1, sizeof(buf)); +	memcpy(buf, str, len); + +	/* Give prog our userspace pointer */ +	skel->bss->user_ptr = buf; + +	/* Trigger tracepoint */ +	usleep(1); + +	/* Did helper fail? */ +	if (CHECK(skel->bss->ret < 0, "prog_ret", "prog returned: %ld\n", +		  skel->bss->ret)) +		return 1; + +	/* Check that string was copied correctly */ +	err = memcmp(skel->bss->buf, str, len); +	if (CHECK(err, "memcmp", "prog copied wrong string")) +		return 1; + +	/* Now check that no extra trailing bytes were copied */ +	memset(buf, 0, sizeof(buf)); +	err = memcmp(skel->bss->buf + len, buf, sizeof(buf) - len); +	if (CHECK(err, "memcmp", "trailing bytes were not stripped")) +		return 1; + +	return 0; +} + +void test_probe_read_user_str(void) +{ +	struct test_probe_read_user_str *skel; +	int err, duration = 0; + +	skel = test_probe_read_user_str__open_and_load(); +	if (CHECK(!skel, "test_probe_read_user_str__open_and_load", +		  "skeleton open and load failed\n")) +		return; + +	/* Give pid to bpf prog so it doesn't read from anyone else */ +	skel->bss->pid = getpid(); + +	err = test_probe_read_user_str__attach(skel); +	if (CHECK(err, "test_probe_read_user_str__attach", +		  "skeleton attach failed: %d\n", err)) +		goto out; + +	if (test_one_str(skel, str1, sizeof(str1))) +		goto out; +	if (test_one_str(skel, str2, sizeof(str2))) +		goto out; +	if (test_one_str(skel, str3, sizeof(str3))) +		goto out; + +out: +	test_probe_read_user_str__destroy(skel); +}  | 
