bpf, x86_32: Fix clobbering of dst for BPF_JSET
Subsystems (4)
Wang YanQing
maintainerPATCH 1/1 bpf, x86_32: Fix clobbering of dst for BPF_JSET
commit 50fe7ebb6475711c15b3397467e6424e20026d94 upstream.
The current JIT clobbers the destination register for BPF_JSET BPF_X and BPF_K by using "and" and "or" instructions. This is fine when the destination register is a temporary loaded from a register stored on the stack but not otherwise.
This patch fixes the problem (for both BPF_K and BPF_X) by always loading the destination register into temporaries since BPF_JSET should not modify the destination register.
This bug may not be currently triggerable as BPF_REG_AX is the only register not stored on the stack and the verifier uses it in a limited way.
--- arch/x86/net/bpf_jit_comp32.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
arch/x86/net/bpf_jit_comp32.c +16 -4
@@ -1968,8 +1968,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, goto emit_cond_jmp_signed; }case BPF_JMP |BPF_JSET |BPF_X : { -u8 dreg_lo = dstk ?IA32_EAX : dst_lo; -u8 dreg_hi = dstk ?IA32_EDX : dst_hi; +u8 dreg_lo =IA32_EAX ; +u8 dreg_hi =IA32_EDX ;u8 sreg_lo = sstk ?IA32_ECX : src_lo;u8 sreg_hi = sstk ?IA32_EBX : src_hi;
@@ -1978,6 +1978,12 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, STACK_VAR(dst_lo));EMIT3 (0x8B ,add_2reg (0x40 ,IA32_EBP ,IA32_EDX ),STACK_VAR (dst_hi)); + }else { +/* mov dreg_lo,dst_lo */ +EMIT2 (0x89 ,add_2reg (0xC0 , dreg_lo, dst_lo)); +/* mov dreg_hi,dst_hi */ +EMIT2 (0x89 , +add_2reg (0xC0 , dreg_hi, dst_hi)); }if (sstk) {
@@ -1996,8 +2002,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, }case BPF_JMP |BPF_JSET |BPF_K : {u32 hi; -u8 dreg_lo = dstk ?IA32_EAX : dst_lo; -u8 dreg_hi = dstk ?IA32_EDX : dst_hi; +u8 dreg_lo =IA32_EAX ; +u8 dreg_hi =IA32_EDX ;u8 sreg_lo =IA32_ECX ;u8 sreg_hi =IA32_EBX ;
@@ -2006,6 +2012,12 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, STACK_VAR(dst_lo));EMIT3 (0x8B ,add_2reg (0x40 ,IA32_EBP ,IA32_EDX ),STACK_VAR (dst_hi)); + }else { +/* mov dreg_lo,dst_lo */ +EMIT2 (0x89 ,add_2reg (0xC0 , dreg_lo, dst_lo)); +/* mov dreg_hi,dst_hi */ +EMIT2 (0x89 , +add_2reg (0xC0 , dreg_hi, dst_hi)); } hi = imm32 & (1 <<31 ) ? (u32 )~0 :0 ;
Signature · 1 line
1.8.5.6.2.g3d8a54e.dirty
Wang YanQing
maintainerQuoted 15 lines · Wang YanQing
commit
50fe7ebb6475711c15b3397467e6424e20026d94upstream.The current JIT clobbers the destination register for
BPF_JSETBPF_XandBPF_Kby using "and" and "or" instructions. This is fine when the destination register is a temporary loaded from a register stored on the stack but not otherwise.This patch fixes the problem (for both
BPF_KandBPF_X) by always loading the destination register into temporaries sinceBPF_JSETshould not modify the destination register.This bug may not be currently triggerable as
BPF_REG_AXis the only register not stored on the stack and the verifier uses it in a limited way.
Quoted 7 lines
Fixes 03f5781be2c7b ("bpf, x86_32: add eBPF JIT compiler for ia32")Signed-off-by Xi Wang <[email protected]>Signed-off-by Luke Nelson <[email protected]>Signed-off-by Alexei Starovoitov <[email protected]>Acked-by Wang YanQing <[email protected]>Signed-off-by Wang YanQing <[email protected]>
Greg KH
maintainerQuoted 16 lines · Wang YanQing
Quoted 15 lines · Wang YanQing
commit
50fe7ebb6475711c15b3397467e6424e20026d94upstream.The current JIT clobbers the destination register for
BPF_JSETBPF_XandBPF_Kby using "and" and "or" instructions. This is fine when the destination register is a temporary loaded from a register stored on the stack but not otherwise.This patch fixes the problem (for both
BPF_KandBPF_X) by always loading the destination register into temporaries sinceBPF_JSETshould not modify the destination register.This bug may not be currently triggerable as
BPF_REG_AXis the only register not stored on the stack and the verifier uses it in a limited way.
Quoted 8 lines
Quoted 7 lines
Fixes 03f5781be2c7b ("bpf, x86_32: add eBPF JIT compiler for ia32")Signed-off-by Xi Wang <[email protected]>Signed-off-by Luke Nelson <[email protected]>Signed-off-by Alexei Starovoitov <[email protected]>Acked-by Wang YanQing <[email protected]>Signed-off-by Wang YanQing <[email protected]>Cc [email protected] #v4.19
Now queued up, thanks.
greg k-h