• Luke Nelson's avatar
    arm, bpf: Fix offset overflow for BPF_MEM BPF_DW · 4178417c
    Luke Nelson authored
    This patch fixes an incorrect check in how immediate memory offsets are
    computed for BPF_DW on arm.
    
    For BPF_LDX/ST/STX + BPF_DW, the 32-bit arm JIT breaks down an 8-byte
    access into two separate 4-byte accesses using off+0 and off+4. If off
    fits in imm12, the JIT emits a ldr/str instruction with the immediate
    and avoids the use of a temporary register. While the current check off
    <= 0xfff ensures that the first immediate off+0 doesn't overflow imm12,
    it's not sufficient for the second immediate off+4, which may cause the
    second access of BPF_DW to read/write the wrong address.
    
    This patch fixes the problem by changing the check to
    off <= 0xfff - 4 for BPF_DW, ensuring off+4 will never overflow.
    
    A side effect of simplifying the check is that it now allows using
    negative immediate offsets in ldr/str. This means that small negative
    offsets can also avoid the use of a temporary register.
    
    This patch introduces no new failures in test_verifier or test_bpf.c.
    
    Fixes: c5eae692 ("ARM: net: bpf: improve 64-bit store implementation")
    Fixes: ec19e02b ("ARM: net: bpf: fix LDX instructions")
    Co-developed-by: default avatarXi Wang <xi.wang@gmail.com>
    Signed-off-by: default avatarXi Wang <xi.wang@gmail.com>
    Signed-off-by: default avatarLuke Nelson <luke.r.nels@gmail.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20200409221752.28448-1-luke.r.nels@gmail.com
    4178417c
bpf_jit_32.c 53.2 KB