• Ilya Leoshkevich's avatar
    bpf: allow narrow loads of some sk_reuseport_md fields with offset > 0 · 2c238177
    Ilya Leoshkevich authored
    test_select_reuseport fails on s390 due to verifier rejecting
    test_select_reuseport_kern.o with the following message:
    
    	; data_check.eth_protocol = reuse_md->eth_protocol;
    	18: (69) r1 = *(u16 *)(r6 +22)
    	invalid bpf_context access off=22 size=2
    
    This is because on big-endian machines casts from __u32 to __u16 are
    generated by referencing the respective variable as __u16 with an offset
    of 2 (as opposed to 0 on little-endian machines).
    
    The verifier already has all the infrastructure in place to allow such
    accesses, it's just that they are not explicitly enabled for
    eth_protocol field. Enable them for eth_protocol field by using
    bpf_ctx_range instead of offsetof.
    
    Ditto for ip_protocol, bind_inany and len, since they already allow
    narrowing, and the same problem can arise when working with them.
    
    Fixes: 2dbb9b9e ("bpf: Introduce BPF_PROG_TYPE_SK_REUSEPORT")
    Signed-off-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    2c238177
filter.c 235 KB