diff options
Diffstat (limited to 'arch/x86/net/bpf_jit_comp.c')
-rw-r--r-- | arch/x86/net/bpf_jit_comp.c | 9 |
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); |
1184 | out_addrs: | 1185 | out_addrs: |
1185 | kfree(addrs); | 1186 | kfree(addrs); |
1186 | kfree(jit_data); | 1187 | kfree(jit_data); |