|
@@ -1769,9 +1769,19 @@ static int check_ld_imm(struct bpf_verifier_env *env, struct bpf_insn *insn)
|
|
|
if (err)
|
|
|
return err;
|
|
|
|
|
|
- if (insn->src_reg == 0)
|
|
|
- /* generic move 64-bit immediate into a register */
|
|
|
+ if (insn->src_reg == 0) {
|
|
|
+ /* generic move 64-bit immediate into a register,
|
|
|
+ * only analyzer needs to collect the ld_imm value.
|
|
|
+ */
|
|
|
+ u64 imm = ((u64)(insn + 1)->imm << 32) | (u32)insn->imm;
|
|
|
+
|
|
|
+ if (!env->analyzer_ops)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ regs[insn->dst_reg].type = CONST_IMM;
|
|
|
+ regs[insn->dst_reg].imm = imm;
|
|
|
return 0;
|
|
|
+ }
|
|
|
|
|
|
/* replace_map_fd_with_map_ptr() should have caught bad ld_imm64 */
|
|
|
BUG_ON(insn->src_reg != BPF_PSEUDO_MAP_FD);
|