bpf: fix BPF_ALU32 | BPF_ARSH on BE arches
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: 2dc6b100f9
("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>
This commit is contained in:
Родитель
6c6874f401
Коммит
75672dda27
|
@ -1364,10 +1364,10 @@ select_insn:
|
||||||
insn++;
|
insn++;
|
||||||
CONT;
|
CONT;
|
||||||
ALU_ARSH_X:
|
ALU_ARSH_X:
|
||||||
DST = (u64) (u32) ((*(s32 *) &DST) >> SRC);
|
DST = (u64) (u32) (((s32) DST) >> SRC);
|
||||||
CONT;
|
CONT;
|
||||||
ALU_ARSH_K:
|
ALU_ARSH_K:
|
||||||
DST = (u64) (u32) ((*(s32 *) &DST) >> IMM);
|
DST = (u64) (u32) (((s32) DST) >> IMM);
|
||||||
CONT;
|
CONT;
|
||||||
ALU64_ARSH_X:
|
ALU64_ARSH_X:
|
||||||
(*(s64 *) &DST) >>= SRC;
|
(*(s64 *) &DST) >>= SRC;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче