Add two tests to verify that the tail padding 4 bytes of struct
bpf_map_info and bpf_prog_info are checked in syscall.c using
bpf_check_uarg_tail_zero().

Signed-off-by: Leon Hwang <[email protected]>
---
 .../selftests/bpf/prog_tests/bpf_attr_size.c  | 55 +++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_attr_size.c 
b/tools/testing/selftests/bpf/prog_tests/bpf_attr_size.c
index 32159dc64da8..87842c4347a6 100644
--- a/tools/testing/selftests/bpf/prog_tests/bpf_attr_size.c
+++ b/tools/testing/selftests/bpf/prog_tests/bpf_attr_size.c
@@ -62,8 +62,63 @@ static void test_query_size_boundaries(void)
        cgroup_skb_direct_packet_access__destroy(skel);
 }
 
+static void test_map_info_tail_zero(void)
+{
+       LIBBPF_OPTS(bpf_map_create_opts, map_opts);
+       struct bpf_map_info_fake {
+               __u8 info[offsetofend(struct bpf_map_info, hash_size)];
+               __u32 pad;
+       } info = {
+               .pad = 1,
+       };
+       int map_fd, err;
+       __u32 info_len;
+
+       map_fd = bpf_map_create(BPF_MAP_TYPE_ARRAY, "arr", sizeof(int), 1, 1, 
&map_opts);
+       if (!ASSERT_GE(map_fd, 0, "bpf_map_create"))
+               return;
+
+       info_len = sizeof(info);
+       err = bpf_obj_get_info_by_fd(map_fd, &info, &info_len);
+       ASSERT_EQ(err, -E2BIG, "bpf_obj_get_info_by_fd");
+
+       close(map_fd);
+}
+
+static void test_prog_info_tail_zero(void)
+{
+       LIBBPF_OPTS(bpf_prog_load_opts, prog_opts);
+       struct bpf_insn insns[] = {
+               BPF_MOV64_IMM(BPF_REG_0, 0),
+               BPF_EXIT_INSN(),
+       };
+       struct bpf_prog_info_fake {
+               __u8 info[offsetofend(struct bpf_prog_info, attach_btf_id)];
+               __u32 pad;
+       } info = {
+               .pad = 1,
+       };
+       int prog_fd, err;
+       __u32 info_len;
+
+       prog_fd = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, "test_prog", 
"GPL", insns,
+                               ARRAY_SIZE(insns), &prog_opts);
+       if (!ASSERT_GE(prog_fd, 0, "bpf_prog_load"))
+               return;
+
+       info_len = sizeof(info);
+       err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
+       ASSERT_EQ(err, -E2BIG, "bpf_obj_get_info_by_fd");
+
+       close(prog_fd);
+}
+
 void test_bpf_attr_size(void)
 {
        if (test__start_subtest("query_size_boundaries"))
                test_query_size_boundaries();
+       if (test__start_subtest("map_info_tail_zero"))
+               test_map_info_tail_zero();
+       if (test__start_subtest("prog_info_tail_zero"))
+               test_prog_info_tail_zero();
 }
-- 
2.54.0


Reply via email to