mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Add both positive and negative tests cases using string kfuncs added in the previous patches. Positive tests check that the functions work as expected. Negative tests pass various incorrect strings to the kfuncs and check for the expected error codes: -E2BIG when passing too long strings -EFAULT when trying to read inaccessible kernel memory -ERANGE when passing userspace pointers on arches with non-overlapping address spaces A majority of the tests use the RUN_TESTS helper which executes BPF programs with BPF_PROG_TEST_RUN and check for the expected return value. An exception to this are tests for long strings as we need to memset the long string from userspace (at least I haven't found an ergonomic way to memset it from a BPF program), which cannot be done using the RUN_TESTS infrastructure. Suggested-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Viktor Malik <vmalik@redhat.com> Link: https://lore.kernel.org/r/090451a2e60c9ae1dceb4d1bfafa3479db5c7481.1750917800.git.vmalik@redhat.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
65 lines
1.5 KiB
C
65 lines
1.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (C) 2025 Red Hat, Inc.*/
|
|
#include <test_progs.h>
|
|
#include "string_kfuncs_success.skel.h"
|
|
#include "string_kfuncs_failure1.skel.h"
|
|
#include "string_kfuncs_failure2.skel.h"
|
|
#include <sys/mman.h>
|
|
|
|
static const char * const test_cases[] = {
|
|
"strcmp",
|
|
"strchr",
|
|
"strchrnul",
|
|
"strnchr",
|
|
"strrchr",
|
|
"strlen",
|
|
"strnlen",
|
|
"strspn_str",
|
|
"strspn_accept",
|
|
"strcspn_str",
|
|
"strcspn_reject",
|
|
"strstr",
|
|
"strnstr",
|
|
};
|
|
|
|
void run_too_long_tests(void)
|
|
{
|
|
struct string_kfuncs_failure2 *skel;
|
|
struct bpf_program *prog;
|
|
char test_name[256];
|
|
int err, i;
|
|
|
|
skel = string_kfuncs_failure2__open_and_load();
|
|
if (!ASSERT_OK_PTR(skel, "string_kfuncs_failure2__open_and_load"))
|
|
return;
|
|
|
|
memset(skel->bss->long_str, 'a', sizeof(skel->bss->long_str));
|
|
|
|
for (i = 0; i < ARRAY_SIZE(test_cases); i++) {
|
|
sprintf(test_name, "test_%s_too_long", test_cases[i]);
|
|
if (!test__start_subtest(test_name))
|
|
continue;
|
|
|
|
prog = bpf_object__find_program_by_name(skel->obj, test_name);
|
|
if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name"))
|
|
goto cleanup;
|
|
|
|
LIBBPF_OPTS(bpf_test_run_opts, topts);
|
|
err = bpf_prog_test_run_opts(bpf_program__fd(prog), &topts);
|
|
if (!ASSERT_OK(err, "bpf_prog_test_run"))
|
|
goto cleanup;
|
|
|
|
ASSERT_EQ(topts.retval, -E2BIG, "reading too long string fails with -E2BIG");
|
|
}
|
|
|
|
cleanup:
|
|
string_kfuncs_failure2__destroy(skel);
|
|
}
|
|
|
|
void test_string_kfuncs(void)
|
|
{
|
|
RUN_TESTS(string_kfuncs_success);
|
|
RUN_TESTS(string_kfuncs_failure1);
|
|
|
|
run_too_long_tests();
|
|
}
|