• Luke Nelson's avatar
    bpf, x86: Fix encoding for lower 8-bit registers in BPF_STX BPF_B · aee194b1
    Luke Nelson authored
    This patch fixes an encoding bug in emit_stx for BPF_B when the source
    register is BPF_REG_FP.
    
    The current implementation for BPF_STX BPF_B in emit_stx saves one REX
    byte when the operands can be encoded using Mod-R/M alone. The lower 8
    bits of registers %rax, %rbx, %rcx, and %rdx can be accessed without using
    a REX prefix via %al, %bl, %cl, and %dl, respectively. Other registers,
    (e.g., %rsi, %rdi, %rbp, %rsp) require a REX prefix to use their 8-bit
    equivalents (%sil, %dil, %bpl, %spl).
    
    The current code checks if the source for BPF_STX BPF_B is BPF_REG_1
    or BPF_REG_2 (which map to %rdi and %rsi), in which case it emits the
    required REX prefix. However, it misses the case when the source is
    BPF_REG_FP (mapped to %rbp).
    
    The result is that BPF_STX BPF_B with BPF_REG_FP as the source operand
    will read from register %ch instead of the correct %bpl. This patch fixes
    the problem by fixing and refactoring the check on which registers need
    the extra REX byte. Since no BPF registers map to %rsp, there is no need
    to handle %spl.
    
    Fixes: 62258278 ("net: filter: x86: internal BPF JIT")
    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 avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20200418232655.23870-1-luke.r.nels@gmail.com
    aee194b1
bpf_jit_comp.c 51.4 KB