bpf: verifier: Do not extract constant map keys for irrelevant maps
Previously, we were trying to extract constant map keys for all bpf_map_lookup_elem(), regardless of map type. This is an issue if the map has a u64 key and the value is very high, as it can be interpreted as a negative signed value. This in turn is treated as an error value by check_func_arg() which causes a valid program to be incorrectly rejected. Fix by only extracting constant map keys for relevant maps. This fix works because nullness elision is only allowed for {PERCPU_}ARRAY maps, and keys for these are within u32 range. See next commit for an example via selftest. Acked-by: Eduard Zingerman <eddyz87@gmail.com> Reported-by: Marc Hartmayer <mhartmay@linux.ibm.com> Reported-by: Ilya Leoshkevich <iii@linux.ibm.com> Tested-by: Marc Hartmayer <mhartmay@linux.ibm.com> Signed-off-by: Daniel Xu <dxu@dxuuu.xyz> Link: https://lore.kernel.org/r/aa868b642b026ff87ba6105ea151bc8693b35932.1738689872.git.dxu@dxuuu.xyz Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
517e8a7835
commit
884c3a18da
1 changed files with 7 additions and 3 deletions
|
@ -9206,6 +9206,8 @@ static s64 get_constant_map_key(struct bpf_verifier_env *env,
|
|||
return reg->var_off.value;
|
||||
}
|
||||
|
||||
static bool can_elide_value_nullness(enum bpf_map_type type);
|
||||
|
||||
static int check_func_arg(struct bpf_verifier_env *env, u32 arg,
|
||||
struct bpf_call_arg_meta *meta,
|
||||
const struct bpf_func_proto *fn,
|
||||
|
@ -9354,9 +9356,11 @@ skip_type_check:
|
|||
err = check_helper_mem_access(env, regno, key_size, BPF_READ, false, NULL);
|
||||
if (err)
|
||||
return err;
|
||||
meta->const_map_key = get_constant_map_key(env, reg, key_size);
|
||||
if (meta->const_map_key < 0 && meta->const_map_key != -EOPNOTSUPP)
|
||||
return meta->const_map_key;
|
||||
if (can_elide_value_nullness(meta->map_ptr->map_type)) {
|
||||
meta->const_map_key = get_constant_map_key(env, reg, key_size);
|
||||
if (meta->const_map_key < 0 && meta->const_map_key != -EOPNOTSUPP)
|
||||
return meta->const_map_key;
|
||||
}
|
||||
break;
|
||||
case ARG_PTR_TO_MAP_VALUE:
|
||||
if (type_may_be_null(arg_type) && register_is_null(reg))
|
||||
|
|
Loading…
Add table
Reference in a new issue