aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/net/bpf_jit_comp.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/net/bpf_jit_comp.c')
-rw-r--r--arch/x86/net/bpf_jit_comp.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
index eaaed5bfc4a4..991549a1c5f3 100644
--- a/arch/x86/net/bpf_jit_comp.c
+++ b/arch/x86/net/bpf_jit_comp.c
@@ -390,8 +390,9 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
390 390
391 emit_prologue(&prog, bpf_prog->aux->stack_depth, 391 emit_prologue(&prog, bpf_prog->aux->stack_depth,
392 bpf_prog_was_classic(bpf_prog)); 392 bpf_prog_was_classic(bpf_prog));
393 addrs[0] = prog - temp;
393 394
394 for (i = 0; i < insn_cnt; i++, insn++) { 395 for (i = 1; i <= insn_cnt; i++, insn++) {
395 const s32 imm32 = insn->imm; 396 const s32 imm32 = insn->imm;
396 u32 dst_reg = insn->dst_reg; 397 u32 dst_reg = insn->dst_reg;
397 u32 src_reg = insn->src_reg; 398 u32 src_reg = insn->src_reg;
@@ -1105,7 +1106,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
1105 extra_pass = true; 1106 extra_pass = true;
1106 goto skip_init_addrs; 1107 goto skip_init_addrs;
1107 } 1108 }
1108 addrs = kmalloc_array(prog->len, sizeof(*addrs), GFP_KERNEL); 1109 addrs = kmalloc_array(prog->len + 1, sizeof(*addrs), GFP_KERNEL);
1109 if (!addrs) { 1110 if (!addrs) {
1110 prog = orig_prog; 1111 prog = orig_prog;
1111 goto out_addrs; 1112 goto out_addrs;
@@ -1115,7 +1116,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
1115 * Before first pass, make a rough estimation of addrs[] 1116 * Before first pass, make a rough estimation of addrs[]
1116 * each BPF instruction is translated to less than 64 bytes 1117 * each BPF instruction is translated to less than 64 bytes
1117 */ 1118 */
1118 for (proglen = 0, i = 0; i < prog->len; i++) { 1119 for (proglen = 0, i = 0; i <= prog->len; i++) {
1119 proglen += 64; 1120 proglen += 64;
1120 addrs[i] = proglen; 1121 addrs[i] = proglen;
1121 } 1122 }
@@ -1180,7 +1181,7 @@ out_image:
1180 1181
1181 if (!image || !prog->is_func || extra_pass) { 1182 if (!image || !prog->is_func || extra_pass) {
1182 if (image) 1183 if (image)
1183 bpf_prog_fill_jited_linfo(prog, addrs); 1184 bpf_prog_fill_jited_linfo(prog, addrs + 1);
1184out_addrs: 1185out_addrs:
1185 kfree(addrs); 1186 kfree(addrs);
1186 kfree(jit_data); 1187 kfree(jit_data);