1 // SPDX-License-Identifier: GPL-2.0
2 #include <test_progs.h>
3
4 #include "map_kptr.skel.h"
5
test_map_uninit_mem_exposure(void)6 void test_map_uninit_mem_exposure(void)
7 {
8 size_t value_sz, slot_sz, lookup_sz, tail_sz;
9 int err, key, nr_cpus, cpu, map_fd;
10 __u8 *value = NULL, *zero = NULL;
11 struct bpf_program *prog;
12 struct map_kptr *skel;
13
14 nr_cpus = libbpf_num_possible_cpus();
15 if (!ASSERT_GT(nr_cpus, 0, "libbpf_num_possible_cpus"))
16 return;
17
18 skel = map_kptr__open();
19 if (!ASSERT_OK_PTR(skel, "map_kptr__open"))
20 return;
21
22 bpf_object__for_each_program(prog, skel->obj) {
23 err = bpf_program__set_autoload(prog, false);
24 if (!ASSERT_OK(err, "bpf_program__set_autoload"))
25 goto out;
26 }
27
28 err = map_kptr__load(skel);
29 if (!ASSERT_OK(err, "map_kptr__load"))
30 goto out;
31
32 value_sz = bpf_map__value_size((skel)->maps.pcpu_array);
33 slot_sz = roundup(value_sz, 8);
34 tail_sz = slot_sz - value_sz;
35 if (!ASSERT_NEQ(tail_sz, 0, "tail_sz"))
36 goto out;
37
38 lookup_sz = slot_sz * nr_cpus;
39 map_fd = bpf_map__fd(skel->maps.pcpu_array);
40
41 value = malloc(lookup_sz);
42 zero = calloc(1, tail_sz);
43 if (!ASSERT_OK_PTR(value, "malloc value") || !ASSERT_OK_PTR(zero, "calloc zero"))
44 goto out;
45
46 key = 0;
47 memset(value, 0x2B, lookup_sz);
48 err = bpf_map_update_elem(map_fd, &key, value, BPF_ANY);
49 if (!ASSERT_OK(err, "bpf_map_update_elem"))
50 goto out;
51
52 memset(value, 0xFF, lookup_sz);
53 err = bpf_map_lookup_elem(map_fd, &key, value);
54 if (!ASSERT_OK(err, "bpf_map_lookup_elem"))
55 goto out;
56
57 for (cpu = 0; cpu < nr_cpus; cpu++) {
58 __u8 *tail = value + cpu * slot_sz + value_sz;
59
60 if (!ASSERT_MEMEQ(tail, zero, tail_sz, "zeroed tail bytes"))
61 goto out;
62 }
63
64 out:
65 free(zero);
66 free(value);
67 map_kptr__destroy(skel);
68 }
69