xref: /linux/tools/testing/selftests/bpf/prog_tests/test_map_uninit.c (revision 163944262f8646bf3a1eec557b6aff1f38582a9f)
1 // SPDX-License-Identifier: GPL-2.0
2 #include <test_progs.h>
3 
4 #include "map_kptr.skel.h"
5 
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