| From 3c69611b8926f8e74fcf76bd97ae0e5dafbeb26a Mon Sep 17 00:00:00 2001 |
| From: Jakub Sitnicki <jakub@cloudflare.com> |
| Date: Sat, 19 Mar 2022 19:33:55 +0100 |
| Subject: selftests/bpf: Fix u8 narrow load checks for bpf_sk_lookup remote_port |
| |
| From: Jakub Sitnicki <jakub@cloudflare.com> |
| |
| commit 3c69611b8926f8e74fcf76bd97ae0e5dafbeb26a upstream. |
| |
| In commit 9a69e2b385f4 ("bpf: Make remote_port field in struct |
| bpf_sk_lookup 16-bit wide") ->remote_port field changed from __u32 to |
| __be16. |
| |
| However, narrow load tests which exercise 1-byte sized loads from |
| offsetof(struct bpf_sk_lookup, remote_port) were not adopted to reflect the |
| change. |
| |
| As a result, on little-endian we continue testing loads from addresses: |
| |
| - (__u8 *)&ctx->remote_port + 3 |
| - (__u8 *)&ctx->remote_port + 4 |
| |
| which map to the zero padding following the remote_port field, and don't |
| break the tests because there is no observable change. |
| |
| While on big-endian, we observe breakage because tests expect to see zeros |
| for values loaded from: |
| |
| - (__u8 *)&ctx->remote_port - 1 |
| - (__u8 *)&ctx->remote_port - 2 |
| |
| Above addresses map to ->remote_ip6 field, which precedes ->remote_port, |
| and are populated during the bpf_sk_lookup IPv6 tests. |
| |
| Unsurprisingly, on s390x we observe: |
| |
| #136/38 sk_lookup/narrow access to ctx v4:OK |
| #136/39 sk_lookup/narrow access to ctx v6:FAIL |
| |
| Fix it by removing the checks for 1-byte loads from offsets outside of the |
| ->remote_port field. |
| |
| Fixes: 9a69e2b385f4 ("bpf: Make remote_port field in struct bpf_sk_lookup 16-bit wide") |
| Suggested-by: Ilya Leoshkevich <iii@linux.ibm.com> |
| Signed-off-by: Jakub Sitnicki <jakub@cloudflare.com> |
| Signed-off-by: Alexei Starovoitov <ast@kernel.org> |
| Acked-by: Martin KaFai Lau <kafai@fb.com> |
| Link: https://lore.kernel.org/bpf/20220319183356.233666-3-jakub@cloudflare.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| tools/testing/selftests/bpf/progs/test_sk_lookup.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/tools/testing/selftests/bpf/progs/test_sk_lookup.c |
| +++ b/tools/testing/selftests/bpf/progs/test_sk_lookup.c |
| @@ -404,8 +404,7 @@ int ctx_narrow_access(struct bpf_sk_look |
| |
| /* Narrow loads from remote_port field. Expect SRC_PORT. */ |
| if (LSB(ctx->remote_port, 0) != ((SRC_PORT >> 0) & 0xff) || |
| - LSB(ctx->remote_port, 1) != ((SRC_PORT >> 8) & 0xff) || |
| - LSB(ctx->remote_port, 2) != 0 || LSB(ctx->remote_port, 3) != 0) |
| + LSB(ctx->remote_port, 1) != ((SRC_PORT >> 8) & 0xff)) |
| return SK_DROP; |
| if (LSW(ctx->remote_port, 0) != SRC_PORT) |
| return SK_DROP; |