Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

selftests/bpf: Migrate recvmsg* return code tests to verifier_sock_addr.c

This set of tests check that the BPF verifier rejects programs with
invalid return codes (recvmsg4 and recvmsg6 hooks can only return 1).
This patch replaces the tests in test_sock_addr.c with
verifier_sock_addr.c, a new verifier prog_tests for sockaddr hooks, in a
step towards fully retiring test_sock_addr.c.

Signed-off-by: Jordan Rife <jrife@google.com>
Link: https://lore.kernel.org/r/20240510190246.3247730-2-jrife@google.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Jordan Rife and committed by
Alexei Starovoitov
73964e90 20a759df

+39 -70
+2
tools/testing/selftests/bpf/prog_tests/verifier.c
··· 66 66 #include "verifier_sdiv.skel.h" 67 67 #include "verifier_search_pruning.skel.h" 68 68 #include "verifier_sock.skel.h" 69 + #include "verifier_sock_addr.skel.h" 69 70 #include "verifier_spill_fill.skel.h" 70 71 #include "verifier_spin_lock.skel.h" 71 72 #include "verifier_stack_ptr.skel.h" ··· 182 181 void test_verifier_sdiv(void) { RUN(verifier_sdiv); } 183 182 void test_verifier_search_pruning(void) { RUN(verifier_search_pruning); } 184 183 void test_verifier_sock(void) { RUN(verifier_sock); } 184 + void test_verifier_sock_addr(void) { RUN(verifier_sock_addr); } 185 185 void test_verifier_spill_fill(void) { RUN(verifier_spill_fill); } 186 186 void test_verifier_spin_lock(void) { RUN(verifier_spin_lock); } 187 187 void test_verifier_stack_ptr(void) { RUN(verifier_stack_ptr); }
+37
tools/testing/selftests/bpf/progs/verifier_sock_addr.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* Copyright (c) 2024 Google LLC */ 3 + 4 + #include <linux/bpf.h> 5 + #include <bpf/bpf_helpers.h> 6 + #include <bpf_sockopt_helpers.h> 7 + #include "bpf_misc.h" 8 + 9 + SEC("cgroup/recvmsg4") 10 + __success 11 + int recvmsg4_good_return_code(struct bpf_sock_addr *ctx) 12 + { 13 + return 1; 14 + } 15 + 16 + SEC("cgroup/recvmsg4") 17 + __failure __msg("At program exit the register R0 has smin=0 smax=0 should have been in [1, 1]") 18 + int recvmsg4_bad_return_code(struct bpf_sock_addr *ctx) 19 + { 20 + return 0; 21 + } 22 + 23 + SEC("cgroup/recvmsg6") 24 + __success 25 + int recvmsg6_good_return_code(struct bpf_sock_addr *ctx) 26 + { 27 + return 1; 28 + } 29 + 30 + SEC("cgroup/recvmsg6") 31 + __failure __msg("At program exit the register R0 has smin=0 smax=0 should have been in [1, 1]") 32 + int recvmsg6_bad_return_code(struct bpf_sock_addr *ctx) 33 + { 34 + return 0; 35 + } 36 + 37 + char _license[] SEC("license") = "GPL";
-70
tools/testing/selftests/bpf/test_sock_addr.c
··· 94 94 static int connect6_prog_load(const struct sock_addr_test *test); 95 95 static int sendmsg_allow_prog_load(const struct sock_addr_test *test); 96 96 static int sendmsg_deny_prog_load(const struct sock_addr_test *test); 97 - static int recvmsg_allow_prog_load(const struct sock_addr_test *test); 98 - static int recvmsg_deny_prog_load(const struct sock_addr_test *test); 99 97 static int sendmsg4_rw_asm_prog_load(const struct sock_addr_test *test); 100 98 static int sendmsg6_rw_asm_prog_load(const struct sock_addr_test *test); 101 99 static int sendmsg6_rw_v4mapped_prog_load(const struct sock_addr_test *test); ··· 371 373 SRC6_REWRITE_IP, 372 374 SYSCALL_EPERM, 373 375 }, 374 - 375 - /* recvmsg */ 376 - { 377 - "recvmsg4: return code ok", 378 - recvmsg_allow_prog_load, 379 - BPF_CGROUP_UDP4_RECVMSG, 380 - BPF_CGROUP_UDP4_RECVMSG, 381 - AF_INET, 382 - SOCK_DGRAM, 383 - NULL, 384 - 0, 385 - NULL, 386 - 0, 387 - NULL, 388 - ATTACH_OKAY, 389 - }, 390 - { 391 - "recvmsg4: return code !ok", 392 - recvmsg_deny_prog_load, 393 - BPF_CGROUP_UDP4_RECVMSG, 394 - BPF_CGROUP_UDP4_RECVMSG, 395 - AF_INET, 396 - SOCK_DGRAM, 397 - NULL, 398 - 0, 399 - NULL, 400 - 0, 401 - NULL, 402 - LOAD_REJECT, 403 - }, 404 - { 405 - "recvmsg6: return code ok", 406 - recvmsg_allow_prog_load, 407 - BPF_CGROUP_UDP6_RECVMSG, 408 - BPF_CGROUP_UDP6_RECVMSG, 409 - AF_INET6, 410 - SOCK_DGRAM, 411 - NULL, 412 - 0, 413 - NULL, 414 - 0, 415 - NULL, 416 - ATTACH_OKAY, 417 - }, 418 - { 419 - "recvmsg6: return code !ok", 420 - recvmsg_deny_prog_load, 421 - BPF_CGROUP_UDP6_RECVMSG, 422 - BPF_CGROUP_UDP6_RECVMSG, 423 - AF_INET6, 424 - SOCK_DGRAM, 425 - NULL, 426 - 0, 427 - NULL, 428 - 0, 429 - NULL, 430 - LOAD_REJECT, 431 - }, 432 376 }; 433 377 434 378 static int load_insns(const struct sock_addr_test *test, ··· 463 523 } 464 524 465 525 static int sendmsg_deny_prog_load(const struct sock_addr_test *test) 466 - { 467 - return xmsg_ret_only_prog_load(test, /*rc*/ 0); 468 - } 469 - 470 - static int recvmsg_allow_prog_load(const struct sock_addr_test *test) 471 - { 472 - return xmsg_ret_only_prog_load(test, /*rc*/ 1); 473 - } 474 - 475 - static int recvmsg_deny_prog_load(const struct sock_addr_test *test) 476 526 { 477 527 return xmsg_ret_only_prog_load(test, /*rc*/ 0); 478 528 }