lkml.org 
[lkml]   [2019]   [Jul]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.1 158/371] bpf: fix BPF_ALU32 | BPF_ARSH on BE arches
    Date
    [ Upstream commit 75672dda27bd00109a84cd975c17949ad9c45663 ]

    Yauheni reported the following code do not work correctly on BE arches:

    ALU_ARSH_X:
    DST = (u64) (u32) ((*(s32 *) &DST) >> SRC);
    CONT;
    ALU_ARSH_K:
    DST = (u64) (u32) ((*(s32 *) &DST) >> IMM);
    CONT;

    and are causing failure of test_verifier test 'arsh32 on imm 2' on BE
    arches.

    The code is taking address and interpreting memory directly, so is not
    endianness neutral. We should instead perform standard C type casting on
    the variable. A u64 to s32 conversion will drop the high 32-bit and reserve
    the low 32-bit as signed integer, this is all we want.

    Fixes: 2dc6b100f928 ("bpf: interpreter support BPF_ALU | BPF_ARSH")
    Reported-by: Yauheni Kaliuta <yauheni.kaliuta@redhat.com>
    Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
    Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
    Signed-off-by: Jiong Wang <jiong.wang@netronome.com>
    Acked-by: Song Liu <songliubraving@fb.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/bpf/core.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
    index 06ba9c5f156b..932fd3fa5a5a 100644
    --- a/kernel/bpf/core.c
    +++ b/kernel/bpf/core.c
    @@ -1367,10 +1367,10 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
    insn++;
    CONT;
    ALU_ARSH_X:
    - DST = (u64) (u32) ((*(s32 *) &DST) >> SRC);
    + DST = (u64) (u32) (((s32) DST) >> SRC);
    CONT;
    ALU_ARSH_K:
    - DST = (u64) (u32) ((*(s32 *) &DST) >> IMM);
    + DST = (u64) (u32) (((s32) DST) >> IMM);
    CONT;
    ALU64_ARSH_X:
    (*(s64 *) &DST) >>= SRC;
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-07-24 22:39    [W:2.206 / U:0.332 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site