| 1 | // SPDX-License-Identifier: GPL-2.0 |
|---|---|
| 2 | |
| 3 | #include <test_progs.h> |
| 4 | #include "bad_struct_ops.skel.h" |
| 5 | #include "bad_struct_ops2.skel.h" |
| 6 | |
| 7 | static void invalid_prog_reuse(void) |
| 8 | { |
| 9 | struct bad_struct_ops *skel; |
| 10 | char *log = NULL; |
| 11 | int err; |
| 12 | |
| 13 | skel = bad_struct_ops__open(); |
| 14 | if (!ASSERT_OK_PTR(skel, "bad_struct_ops__open")) |
| 15 | return; |
| 16 | |
| 17 | if (start_libbpf_log_capture()) |
| 18 | goto cleanup; |
| 19 | |
| 20 | err = bad_struct_ops__load(skel); |
| 21 | log = stop_libbpf_log_capture(); |
| 22 | ASSERT_ERR(err, "bad_struct_ops__load should fail"); |
| 23 | ASSERT_HAS_SUBSTR(log, |
| 24 | "struct_ops init_kern testmod_2 func ptr test_1: invalid reuse of prog test_1", |
| 25 | "expected init_kern message"); |
| 26 | |
| 27 | cleanup: |
| 28 | free(log); |
| 29 | bad_struct_ops__destroy(skel); |
| 30 | } |
| 31 | |
| 32 | static void unused_program(void) |
| 33 | { |
| 34 | struct bad_struct_ops2 *skel; |
| 35 | char *log = NULL; |
| 36 | int err; |
| 37 | |
| 38 | skel = bad_struct_ops2__open(); |
| 39 | if (!ASSERT_OK_PTR(skel, "bad_struct_ops2__open")) |
| 40 | return; |
| 41 | |
| 42 | /* struct_ops programs not referenced from any maps are open |
| 43 | * with autoload set to true. |
| 44 | */ |
| 45 | ASSERT_TRUE(bpf_program__autoload(skel->progs.foo), "foo autoload == true"); |
| 46 | |
| 47 | if (start_libbpf_log_capture()) |
| 48 | goto cleanup; |
| 49 | |
| 50 | err = bad_struct_ops2__load(skel); |
| 51 | ASSERT_ERR(err, "bad_struct_ops2__load should fail"); |
| 52 | log = stop_libbpf_log_capture(); |
| 53 | ASSERT_HAS_SUBSTR(log, "prog 'foo': failed to load", |
| 54 | "message about 'foo' failing to load"); |
| 55 | |
| 56 | cleanup: |
| 57 | free(log); |
| 58 | bad_struct_ops2__destroy(skel); |
| 59 | } |
| 60 | |
| 61 | void test_bad_struct_ops(void) |
| 62 | { |
| 63 | if (test__start_subtest("invalid_prog_reuse")) |
| 64 | invalid_prog_reuse(); |
| 65 | if (test__start_subtest("unused_program")) |
| 66 | unused_program(); |
| 67 | } |
| 68 |
