On Tue, Sep 24, 2024 at 12:40 PM Daniel Xu dxu@dxuuu.xyz wrote:
+/* Returns constant key value if possible, else -1 */ +static long get_constant_map_key(struct bpf_verifier_env *env,
struct bpf_reg_state *key)
+{
struct bpf_func_state *state = func(env, key);
struct bpf_reg_state *reg;
int stack_off;
int slot;
int spi;
if (key->type != PTR_TO_STACK)
return -1;
if (!tnum_is_const(key->var_off))
return -1;
stack_off = key->off + key->var_off.value;
slot = -stack_off - 1;
if (slot < 0)
/* Stack grew upwards */
The comment is misleading. The verifier is supposed to catch this. It's just this helper was called before the stack bounds were checked? Maybe the call can be done later?
return -1;
else if (slot >= state->allocated_stack)
/* Stack uninitialized */
return -1;
spi = slot / BPF_REG_SIZE;
reg = &state->stack[spi].spilled_ptr;
if (!tnum_is_const(reg->var_off))
/* Stack value not statically known */
return -1;
return reg->var_off.value;
+}
Looks like the code is more subtle than it looks.
I think it's better to guard it all with CAP_BPF.
pw-bot: cr