Skip to content

Commit 0771494

Browse files
puranjaymohangregkh
authored andcommitted
bpf, arm64: Fix trampoline for BPF_TRAMP_F_CALL_ORIG
commit 19d3c179a37730caf600a97fed3794feac2b197b upstream. When BPF_TRAMP_F_CALL_ORIG is set, the trampoline calls __bpf_tramp_enter() and __bpf_tramp_exit() functions, passing them the struct bpf_tramp_image *im pointer as an argument in R0. The trampoline generation code uses emit_addr_mov_i64() to emit instructions for moving the bpf_tramp_image address into R0, but emit_addr_mov_i64() assumes the address to be in the vmalloc() space and uses only 48 bits. Because bpf_tramp_image is allocated using kzalloc(), its address can use more than 48-bits, in this case the trampoline will pass an invalid address to __bpf_tramp_enter/exit() causing a kernel crash. Fix this by using emit_a64_mov_i64() in place of emit_addr_mov_i64() as it can work with addresses that are greater than 48-bits. Fixes: efc9909 ("bpf, arm64: Add bpf trampoline for arm64") Signed-off-by: Puranjay Mohan <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Closes: https://lore.kernel.org/all/SJ0PR15MB461564D3F7E7A763498CA6A8CBDB2@SJ0PR15MB4615.namprd15.prod.outlook.com/ Link: https://lore.kernel.org/bpf/[email protected] [Minor context change fixed.] Signed-off-by: Bin Lan <[email protected]> Signed-off-by: He Zhe <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 92f0867 commit 0771494

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

arch/arm64/net/bpf_jit_comp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1942,7 +1942,7 @@ static int prepare_trampoline(struct jit_ctx *ctx, struct bpf_tramp_image *im,
19421942
emit(A64_STR64I(A64_R(20), A64_SP, regs_off + 8), ctx);
19431943

19441944
if (flags & BPF_TRAMP_F_CALL_ORIG) {
1945-
emit_addr_mov_i64(A64_R(0), (const u64)im, ctx);
1945+
emit_a64_mov_i64(A64_R(0), (const u64)im, ctx);
19461946
emit_call((const u64)__bpf_tramp_enter, ctx);
19471947
}
19481948

@@ -1986,7 +1986,7 @@ static int prepare_trampoline(struct jit_ctx *ctx, struct bpf_tramp_image *im,
19861986

19871987
if (flags & BPF_TRAMP_F_CALL_ORIG) {
19881988
im->ip_epilogue = ctx->image + ctx->idx;
1989-
emit_addr_mov_i64(A64_R(0), (const u64)im, ctx);
1989+
emit_a64_mov_i64(A64_R(0), (const u64)im, ctx);
19901990
emit_call((const u64)__bpf_tramp_exit, ctx);
19911991
}
19921992

0 commit comments

Comments
 (0)