]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: Add tests to verify checking padding bytes for bpf_[map,prog]_info
authorLeon Hwang <leon.hwang@linux.dev>
Fri, 5 Jun 2026 15:52:49 +0000 (23:52 +0800)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 5 Jun 2026 22:21:24 +0000 (15:21 -0700)
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 <leon.hwang@linux.dev>
Link: https://lore.kernel.org/r/20260605155249.20772-4-leon.hwang@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/bpf_attr_size.c

index 32159dc64da8b0b4a820073e8f39dd63ce043e0d..87842c4347a69f9fac3f828c93bee48a67487b92 100644 (file)
@@ -62,8 +62,63 @@ cleanup:
        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();
 }