aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/bpf
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2016-09-21 06:43:59 -0400
committerDavid S. Miller <davem@davemloft.net>2016-09-21 19:50:02 -0400
commit6b17387307bafc71624b9890b9239b6a438e2e89 (patch)
tree7aca8f20e9bb67b803f70ae60cda1f53b397d325 /kernel/bpf
parent13a27dfc669724564aafa2699976ee756029fed2 (diff)
bpf: recognize 64bit immediate loads as consts
When running as parser interpret BPF_LD | BPF_IMM | BPF_DW instructions as loading CONST_IMM with the value stored in imm. The verifier will continue not recognizing those due to concerns about search space/program complexity increase. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Acked-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'kernel/bpf')
-rw-r--r--kernel/bpf/verifier.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index ee86a77dc40b..8c3f794c7028 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -1769,9 +1769,19 @@ static int check_ld_imm(struct bpf_verifier_env *env, struct bpf_insn *insn)
1769 if (err) 1769 if (err)
1770 return err; 1770 return err;
1771 1771
1772 if (insn->src_reg == 0) 1772 if (insn->src_reg == 0) {
1773 /* generic move 64-bit immediate into a register */ 1773 /* generic move 64-bit immediate into a register,
1774 * only analyzer needs to collect the ld_imm value.
1775 */
1776 u64 imm = ((u64)(insn + 1)->imm << 32) | (u32)insn->imm;
1777
1778 if (!env->analyzer_ops)
1779 return 0;
1780
1781 regs[insn->dst_reg].type = CONST_IMM;
1782 regs[insn->dst_reg].imm = imm;
1774 return 0; 1783 return 0;
1784 }
1775 1785
1776 /* replace_map_fd_with_map_ptr() should have caught bad ld_imm64 */ 1786 /* replace_map_fd_with_map_ptr() should have caught bad ld_imm64 */
1777 BUG_ON(insn->src_reg != BPF_PSEUDO_MAP_FD); 1787 BUG_ON(insn->src_reg != BPF_PSEUDO_MAP_FD);