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