120 lines · c
1// SPDX-License-Identifier: GPL-2.02 3/*4 * Copyright (c) 2022 Facebook5 * Copyright (C) 2022 Huawei Technologies Duesseldorf GmbH6 *7 * Author: Roberto Sassu <roberto.sassu@huawei.com>8 */9 10#include <test_progs.h>11#include "test_kfunc_dynptr_param.skel.h"12 13static struct {14 const char *prog_name;15 int expected_runtime_err;16} kfunc_dynptr_tests[] = {17 {"dynptr_data_null", -EBADMSG},18};19 20static bool kfunc_not_supported;21 22static int libbpf_print_cb(enum libbpf_print_level level, const char *fmt,23 va_list args)24{25 if (strcmp(fmt, "libbpf: extern (func ksym) '%s': not found in kernel or module BTFs\n"))26 return 0;27 28 if (strcmp(va_arg(args, char *), "bpf_verify_pkcs7_signature"))29 return 0;30 31 kfunc_not_supported = true;32 return 0;33}34 35static bool has_pkcs7_kfunc_support(void)36{37 struct test_kfunc_dynptr_param *skel;38 libbpf_print_fn_t old_print_cb;39 int err;40 41 skel = test_kfunc_dynptr_param__open();42 if (!ASSERT_OK_PTR(skel, "test_kfunc_dynptr_param__open"))43 return false;44 45 kfunc_not_supported = false;46 47 old_print_cb = libbpf_set_print(libbpf_print_cb);48 err = test_kfunc_dynptr_param__load(skel);49 libbpf_set_print(old_print_cb);50 51 if (err < 0 && kfunc_not_supported) {52 fprintf(stderr,53 "%s:SKIP:bpf_verify_pkcs7_signature() kfunc not supported\n",54 __func__);55 test_kfunc_dynptr_param__destroy(skel);56 return false;57 }58 59 test_kfunc_dynptr_param__destroy(skel);60 61 return true;62}63 64static void verify_success(const char *prog_name, int expected_runtime_err)65{66 struct test_kfunc_dynptr_param *skel;67 struct bpf_program *prog;68 struct bpf_link *link;69 __u32 next_id;70 int err;71 72 skel = test_kfunc_dynptr_param__open();73 if (!ASSERT_OK_PTR(skel, "test_kfunc_dynptr_param__open"))74 return;75 76 skel->bss->pid = getpid();77 78 err = test_kfunc_dynptr_param__load(skel);79 80 if (!ASSERT_OK(err, "test_kfunc_dynptr_param__load"))81 goto cleanup;82 83 prog = bpf_object__find_program_by_name(skel->obj, prog_name);84 if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name"))85 goto cleanup;86 87 link = bpf_program__attach(prog);88 if (!ASSERT_OK_PTR(link, "bpf_program__attach"))89 goto cleanup;90 91 err = bpf_prog_get_next_id(0, &next_id);92 93 bpf_link__destroy(link);94 95 if (!ASSERT_OK(err, "bpf_prog_get_next_id"))96 goto cleanup;97 98 ASSERT_EQ(skel->bss->err, expected_runtime_err, "err");99 100cleanup:101 test_kfunc_dynptr_param__destroy(skel);102}103 104void test_kfunc_dynptr_param(void)105{106 int i;107 108 if (!has_pkcs7_kfunc_support())109 return;110 111 for (i = 0; i < ARRAY_SIZE(kfunc_dynptr_tests); i++) {112 if (!test__start_subtest(kfunc_dynptr_tests[i].prog_name))113 continue;114 115 verify_success(kfunc_dynptr_tests[i].prog_name,116 kfunc_dynptr_tests[i].expected_runtime_err);117 }118 RUN_TESTS(test_kfunc_dynptr_param);119}120