-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests: Add test for overriding global data value before load
This adds a test to exercise the new bpf_map__set_initial_value() function. The test simply overrides the global data section with all zeroes, and checks that the new value makes it into the kernel map on load. Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Andrii Nakryiko <andriin@fb.com> Link: https://lore.kernel.org/bpf/20200329132253.232541-2-toke@redhat.com
- Loading branch information
Toke Høiland-Jørgensen
authored and
Daniel Borkmann
committed
Mar 29, 2020
1 parent
e2842be
commit e5fb60e
Showing
2 changed files
with
62 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
#include <test_progs.h> | ||
|
||
void test_global_data_init(void) | ||
{ | ||
const char *file = "./test_global_data.o"; | ||
int err = -ENOMEM, map_fd, zero = 0; | ||
__u8 *buff = NULL, *newval = NULL; | ||
struct bpf_object *obj; | ||
struct bpf_map *map; | ||
__u32 duration = 0; | ||
size_t sz; | ||
|
||
obj = bpf_object__open_file(file, NULL); | ||
if (CHECK_FAIL(!obj)) | ||
return; | ||
|
||
map = bpf_object__find_map_by_name(obj, "test_glo.rodata"); | ||
if (CHECK_FAIL(!map || !bpf_map__is_internal(map))) | ||
goto out; | ||
|
||
sz = bpf_map__def(map)->value_size; | ||
newval = malloc(sz); | ||
if (CHECK_FAIL(!newval)) | ||
goto out; | ||
|
||
memset(newval, 0, sz); | ||
/* wrong size, should fail */ | ||
err = bpf_map__set_initial_value(map, newval, sz - 1); | ||
if (CHECK(!err, "reject set initial value wrong size", "err %d\n", err)) | ||
goto out; | ||
|
||
err = bpf_map__set_initial_value(map, newval, sz); | ||
if (CHECK(err, "set initial value", "err %d\n", err)) | ||
goto out; | ||
|
||
err = bpf_object__load(obj); | ||
if (CHECK_FAIL(err)) | ||
goto out; | ||
|
||
map_fd = bpf_map__fd(map); | ||
if (CHECK_FAIL(map_fd < 0)) | ||
goto out; | ||
|
||
buff = malloc(sz); | ||
if (buff) | ||
err = bpf_map_lookup_elem(map_fd, &zero, buff); | ||
if (CHECK(!buff || err || memcmp(buff, newval, sz), | ||
"compare .rodata map data override", | ||
"err %d errno %d\n", err, errno)) | ||
goto out; | ||
|
||
memset(newval, 1, sz); | ||
/* object loaded - should fail */ | ||
err = bpf_map__set_initial_value(map, newval, sz); | ||
CHECK(!err, "reject set initial value after load", "err %d\n", err); | ||
out: | ||
free(buff); | ||
free(newval); | ||
bpf_object__close(obj); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters