Commit f80f88f0 authored by Florent Revest's avatar Florent Revest Committed by Andrii Nakryiko
Browse files

selftests/bpf: Fix the snprintf test



The BPF program for the snprintf selftest runs on all syscall entries.
On busy multicore systems this can cause concurrency issues.

For example it was observed that sometimes the userspace part of the
test reads "    4 0000" instead of "    4 000" (extra '0' at the end)
which seems to happen just before snprintf on another core sets
end[-1] = '\0'.

This patch adds a pid filter to the test to ensure that no
bpf_snprintf() will write over the test's output buffers while the
userspace reads the values.

Fixes: c2e39c6b ("selftests/bpf: Add a series of tests for bpf_snprintf")
Reported-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarFlorent Revest <revest@chromium.org>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20210428152501.1024509-1-revest@chromium.org
parent d4eecfb2
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ void test_snprintf_positive(void)
	if (!ASSERT_OK_PTR(skel, "skel_open"))
		return;

	skel->bss->pid = getpid();

	if (!ASSERT_OK(test_snprintf__attach(skel), "skel_attach"))
		goto cleanup;

+5 −0
Original line number Diff line number Diff line
@@ -5,6 +5,8 @@
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>

__u32 pid = 0;

char num_out[64] = {};
long num_ret = 0;

@@ -42,6 +44,9 @@ int handler(const void *ctx)
	static const char str1[] = "str1";
	static const char longstr[] = "longstr";

	if ((int)bpf_get_current_pid_tgid() != pid)
		return 0;

	/* Integer types */
	num_ret  = BPF_SNPRINTF(num_out, sizeof(num_out),
				"%d %u %x %li %llu %lX",