1 // SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause 2 /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */ 3 #include <test_progs.h> 4 5 #ifdef HAS_BPF_ARENA_ASAN 6 #include <unistd.h> 7 8 #include <libarena/common.h> 9 #include <libarena/asan.h> 10 #include <libarena/buddy.h> 11 #include <libarena/userspace.h> 12 13 #include "libarena/libarena_asan.skel.h" 14 15 static void run_libarena_asan_test(struct libarena_asan *skel, 16 struct bpf_program *prog, const char *name) 17 { 18 int ret; 19 20 if (!strstr(name, "test_buddy")) { 21 ret = libarena_run_prog(bpf_program__fd(skel->progs.arena_buddy_reset)); 22 if (!ASSERT_OK(ret, "arena_buddy_reset")) 23 return; 24 } 25 26 ret = libarena_run_prog(bpf_program__fd(prog)); 27 ASSERT_OK(ret, name); 28 29 verify_test_stderr(skel->obj, prog); 30 } 31 32 static void run_test(void) 33 { 34 struct arena_alloc_reserve_args args; 35 struct libarena_asan *skel; 36 struct bpf_program *prog; 37 int ret; 38 39 skel = libarena_asan__open_and_load(); 40 if (!ASSERT_OK_PTR(skel, "open_and_load")) 41 return; 42 43 ret = libarena_asan__attach(skel); 44 if (!ASSERT_OK(ret, "attach")) 45 goto out; 46 47 args.nr_pages = ARENA_RESERVE_PAGES_DFL; 48 49 ret = libarena_run_prog_args(bpf_program__fd(skel->progs.arena_alloc_reserve), 50 &args, sizeof(args)); 51 if (!ASSERT_OK(ret, "arena_alloc_reserve")) 52 goto out; 53 54 ret = libarena_asan_init( 55 bpf_program__fd(skel->progs.arena_get_info), 56 bpf_program__fd(skel->progs.asan_init), 57 (1ULL << 32) / sysconf(_SC_PAGESIZE)); 58 if (!ASSERT_OK(ret, "libarena_asan_init")) 59 goto out; 60 61 bpf_object__for_each_program(prog, skel->obj) { 62 const char *name = bpf_program__name(prog); 63 64 if (!libarena_is_asan_test_prog(name)) 65 continue; 66 67 if (!test__start_subtest(name)) 68 continue; 69 70 run_libarena_asan_test(skel, prog, name); 71 } 72 73 out: 74 libarena_asan__destroy(skel); 75 } 76 77 #endif /* HAS_BPF_ARENA_ASAN */ 78 79 /* 80 * Run the test depending on whether LLVM can compile arena ASAN 81 * programs. 82 */ 83 void test_libarena_asan(void) 84 { 85 #ifdef HAS_BPF_ARENA_ASAN 86 run_test(); 87 #else 88 test__skip(); 89 #endif 90 91 return; 92 } 93 94