mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH bpf 1/2] bpf, x32: Fix invalid instruction in BPF_LDX zero-extension
@ 2020-04-21 17:15 Luke Nelson
  2020-04-21 17:15 ` [PATCH bpf 2/2] bpf, x32: Fix clobbering of dst for BPF_JSET Luke Nelson
  2020-04-21 17:39 ` [PATCH bpf 1/2] bpf, x32: Fix invalid instruction in BPF_LDX zero-extension H. Peter Anvin
  0 siblings, 2 replies; 8+ messages in thread
From: Luke Nelson @ 2020-04-21 17:15 UTC (permalink / raw)
  To: bpf
  Cc: Luke Nelson, Xi Wang, Wang YanQing, David S. Miller,
	Alexey Kuznetsov, Hideaki YOSHIFUJI, Thomas Gleixner,
	Ingo Molnar, Borislav Petkov, x86, H. Peter Anvin,
	Alexei Starovoitov, Daniel Borkmann, Martin KaFai Lau, Song Liu,
	Yonghong Song, Andrii Nakryiko, John Fastabend, KP Singh, netdev,
	linux-kernel

The current JIT uses the following sequence to zero-extend into the
upper 32 bits of the destination register for BPF_LDX BPF_{B,H,W},
when the destination register is not on the stack:

  EMIT3(0xC7, add_1reg(0xC0, dst_hi), 0);

However, this is not a valid instruction on x86.

This patch fixes the problem by instead emitting "xor dst_hi,dst_hi"
to clear the upper 32 bits.

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, and the verifier implements a zero-extension optimization. But the
JIT should avoid emitting invalid instructions regardless.

Fixes: 03f5781be2c7b ("bpf, x86_32: add eBPF JIT compiler for ia32")
Signed-off-by: Xi Wang <xi.wang@gmail.com>
Signed-off-by: Luke Nelson <luke.r.nels@gmail.com>
---
 arch/x86/net/bpf_jit_comp32.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/x86/net/bpf_jit_comp32.c b/arch/x86/net/bpf_jit_comp32.c
index 4d2a7a764602..cc9ad3892ea6 100644
--- a/arch/x86/net/bpf_jit_comp32.c
+++ b/arch/x86/net/bpf_jit_comp32.c
@@ -1854,7 +1854,9 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
 					      STACK_VAR(dst_hi));
 					EMIT(0x0, 4);
 				} else {
-					EMIT3(0xC7, add_1reg(0xC0, dst_hi), 0);
+					/* xor dst_hi,dst_hi */
+					EMIT2(0x33,
+					      add_2reg(0xC0, dst_hi, dst_hi));
 				}
 				break;
 			case BPF_DW:
-- 
2.17.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-04-22  7:22 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-21 17:15 [PATCH bpf 1/2] bpf, x32: Fix invalid instruction in BPF_LDX zero-extension Luke Nelson
2020-04-21 17:15 ` [PATCH bpf 2/2] bpf, x32: Fix clobbering of dst for BPF_JSET Luke Nelson
2020-04-21 17:39 ` [PATCH bpf 1/2] bpf, x32: Fix invalid instruction in BPF_LDX zero-extension H. Peter Anvin
2020-04-21 19:26   ` Xi Wang
2020-04-22  3:22     ` Brian Gerst
2020-04-22  4:13       ` Xi Wang
2020-04-22  7:13     ` hpa
2020-04-22  7:22       ` Xi Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®