// SPDX-License-Identifier: GPL-2.0 #include #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); }