On Fri, Mar 1, 2019 at 12:19 AM Daniel Borkmann <daniel@xxxxxxxxxxxxx> wrote: > This generic extension to BPF maps allows for directly loading an > address residing inside a BPF map value as a single BPF ldimm64 > instruction. [...] > @@ -6698,16 +6705,44 @@ static int replace_map_fd_with_map_ptr(struct bpf_verifier_env *env) > return err; > } > > - /* store map pointer inside BPF_LD_IMM64 instruction */ > - insn[0].imm = (u32) (unsigned long) map; > - insn[1].imm = ((u64) (unsigned long) map) >> 32; > + aux = &env->insn_aux_data[i]; > + if (insn->src_reg == BPF_PSEUDO_MAP_FD) { > + addr = (unsigned long)map; > + } else { > + u32 off = insn[1].imm; > + > + if (off >= BPF_MAX_VAR_OFF) { > + verbose(env, "direct value offset of %u is not allowed\n", > + off); > + return -EINVAL; > + } > + if (!map->ops->map_direct_value_access) { > + verbose(env, "no direct value access support for this map type\n"); > + return -EINVAL; > + } > + > + err = map->ops->map_direct_value_access(map, off, &addr); > + if (err) { > + verbose(env, "invalid access to map value pointer, value_size=%u off=%u\n", > + map->value_size, off); > + return err; > + } All these error returns need fdput(f), I think.