selftests/bpf: fix "bind{4,6} deny specific IP & port" on s390
Subsystems (3)
PATCH v2 1/1 selftests/bpf: fix "bind{4,6} deny specific IP & port" on s390
"bind4 allow specific IP & port" and "bind6 deny specific IP & port" fail on s390 because of endianness issue: the 4 IP address bytes are loaded as a word and compared with a constant, but the value of this constant should be different on big- and little- endian machines, which is not the case right now.
Use __bpf_constant_ntohl to generate proper value based on machine endianness.
---v1->v2: Use bpf_endian.h and __bpf_constant_ntohl.
tools/testing/selftests/bpf/test_sock.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
tools/testing/selftests/bpf/test_sock.c +5 -2
@@ -13,6 +13,7 @@#include <bpf/bpf.h> #include "cgroup_helpers.h" +#include "bpf_endian.h" #include "bpf_rlimit.h" #include "bpf_util.h"
@@ -232,7 +233,8 @@ static struct sock_test tests[] = {/* if (ip == expected && port == expected) */ BPF_LDX_MEM (BPF_W ,BPF_REG_7 ,BPF_REG_6 , offsetof(struct bpf_sock, src_ip6[3])), -BPF_JMP_IMM (BPF_JNE ,BPF_REG_7 ,0x01000000 ,4 ), +BPF_JMP_IMM (BPF_JNE ,BPF_REG_7 , +__bpf_constant_ntohl (0x00000001 ),4 ),BPF_LDX_MEM (BPF_W ,BPF_REG_7 ,BPF_REG_6 , offsetof(struct bpf_sock , src_port)), BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 0x2001, 2),
@@ -261,7 +263,8 @@ static struct sock_test tests[] = {/* if (ip == expected && port == expected) */ BPF_LDX_MEM (BPF_W ,BPF_REG_7 ,BPF_REG_6 , offsetof(struct bpf_sock , src_ip4)), -BPF_JMP_IMM (BPF_JNE ,BPF_REG_7 ,0x0100007F ,4 ), +BPF_JMP_IMM (BPF_JNE ,BPF_REG_7 , +__bpf_constant_ntohl (0x7F000001 ),4 ),BPF_LDX_MEM (BPF_W ,BPF_REG_7 ,BPF_REG_6 , offsetof(struct bpf_sock , src_port)), BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 0x1002, 2),
Signature · 1 line
2.21.0
Daniel Borkmann
maintainerQuoted 11 lines · Ilya Leoshkevich
"bind4 allow specific IP & port" and "bind6 deny specific IP & port" fail on s390 because of endianness issue: the 4 IP address bytes are loaded as a word and compared with a constant, but the value of this constant should be different on big- and little- endian machines, which is not the case right now.
Use
__bpf_constant_ntohlto generate proper value based on machine endianness.Fixes 1d436885b23b ("selftests/bpf: Selftest for sys_bind post-hooks.")Signed-off-by Ilya Leoshkevich <[email protected]>
Looks good, applied, thanks.