• Jakub Sitnicki's avatar
    selftests/bpf: Fix u8 narrow load checks for bpf_sk_lookup remote_port · 3c69611b
    Jakub Sitnicki authored
    In commit 9a69e2b3 ("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: 9a69e2b3 ("bpf: Make remote_port field in struct bpf_sk_lookup 16-bit wide")
    Suggested-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
    Signed-off-by: default avatarJakub Sitnicki <jakub@cloudflare.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Link: https://lore.kernel.org/bpf/20220319183356.233666-3-jakub@cloudflare.com
    3c69611b
test_sk_lookup.c 18.4 KB