diff options
author | Jakub Kicinski <jakub.kicinski@netronome.com> | 2016-09-21 06:43:59 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-09-21 19:50:02 -0400 |
commit | 6b17387307bafc71624b9890b9239b6a438e2e89 (patch) | |
tree | 7aca8f20e9bb67b803f70ae60cda1f53b397d325 /kernel/bpf | |
parent | 13a27dfc669724564aafa2699976ee756029fed2 (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.c | 14 |
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); |