• Ilya Leoshkevich's avatar
    bpf: Allow narrow loads of bpf_sysctl fields with offset > 0 · 7541c87c
    Ilya Leoshkevich authored
    "ctx:file_pos sysctl:read read ok narrow" works on s390 by accident: it
    reads the wrong byte, which happens to have the expected value of 0.
    Improve the test by seeking to the 4th byte and expecting 4 instead of
    0.
    
    This makes the latent problem apparent: the test attempts to read the
    first byte of bpf_sysctl.file_pos, assuming this is the least-significant
    byte, which is not the case on big-endian machines: a non-zero offset is
    needed.
    
    The point of the test is to verify narrow loads, so we cannot cheat our
    way out by simply using BPF_W. The existence of the test means that such
    loads have to be supported, most likely because llvm can generate them.
    Fix the test by adding a big-endian variant, which uses an offset to
    access the least-significant byte of bpf_sysctl.file_pos.
    
    This reveals the final problem: verifier rejects accesses to bpf_sysctl
    fields with offset > 0. Such accesses are already allowed for a wide
    range of structs: __sk_buff, bpf_sock_addr and sk_msg_md to name a few.
    Extend this support to bpf_sysctl by using bpf_ctx_range instead of
    offsetof when matching field offsets.
    
    Fixes: 7b146ceb ("bpf: Sysctl hook")
    Fixes: e1550bfe ("bpf: Add file_pos field to bpf_sysctl ctx")
    Fixes: 9a1027e5 ("selftests/bpf: Test file_pos field in bpf_sysctl ctx")
    Signed-off-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarAndrey Ignatov <rdna@fb.com>
    Acked-by: default avatarAndrii Nakryiko <andriin@fb.com>
    Link: https://lore.kernel.org/bpf/20191028122902.9763-1-iii@linux.ibm.com
    7541c87c
cgroup.c 39.6 KB