Skip to content

Commit 3f7352b

Browse files
Alexei Starovoitovdavem330
Alexei Starovoitov
authored andcommitted
x86: bpf_jit: fix compilation of large bpf programs
x86 has variable length encoding. x86 JIT compiler is trying to pick the shortest encoding for given bpf instruction. While doing so the jump targets are changing, so JIT is doing multiple passes over the program. Typical program needs 3 passes. Some very short programs converge with 2 passes. Large programs may need 4 or 5. But specially crafted bpf programs may hit the pass limit and if the program converges on the last iteration the JIT compiler will be producing an image full of 'int 3' insns. Fix this corner case by doing final iteration over bpf program. Fixes: 0a14842 ("net: filter: Just In Time compiler for x86-64") Reported-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: Alexei Starovoitov <ast@plumgrid.com> Tested-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent cc4a84c commit 3f7352b

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

Diff for: arch/x86/net/bpf_jit_comp.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -966,7 +966,12 @@ void bpf_int_jit_compile(struct bpf_prog *prog)
966966
}
967967
ctx.cleanup_addr = proglen;
968968

969-
for (pass = 0; pass < 10; pass++) {
969+
/* JITed image shrinks with every pass and the loop iterates
970+
* until the image stops shrinking. Very large bpf programs
971+
* may converge on the last pass. In such case do one more
972+
* pass to emit the final image
973+
*/
974+
for (pass = 0; pass < 10 || image; pass++) {
970975
proglen = do_jit(prog, addrs, image, oldproglen, &ctx);
971976
if (proglen <= 0) {
972977
image = NULL;

0 commit comments

Comments
 (0)