Skip to content

Commit e2d2afe

Browse files
Josef Bacikdavem330
authored andcommitted
bpf: fix states equal logic for varlen access
If we have a branch that looks something like this int foo = map->value; if (condition) { foo += blah; } else { foo = bar; } map->array[foo] = baz; We will incorrectly assume that the !condition branch is equal to the condition branch as the register for foo will be UNKNOWN_VALUE in both cases. We need to adjust this logic to only do this if we didn't do a varlen access after we processed the !condition branch, otherwise we have different ranges and need to check the other branch as well. Fixes: 4846113 ("bpf: allow access into map value arrays") Reported-by: Jann Horn <jannh@google.com> Signed-off-by: Josef Bacik <jbacik@fb.com> Acked-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 0fcba28 commit e2d2afe

1 file changed

Lines changed: 8 additions & 2 deletions

File tree

kernel/bpf/verifier.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2454,6 +2454,7 @@ static bool states_equal(struct bpf_verifier_env *env,
24542454
struct bpf_verifier_state *old,
24552455
struct bpf_verifier_state *cur)
24562456
{
2457+
bool varlen_map_access = env->varlen_map_value_access;
24572458
struct bpf_reg_state *rold, *rcur;
24582459
int i;
24592460

@@ -2467,12 +2468,17 @@ static bool states_equal(struct bpf_verifier_env *env,
24672468
/* If the ranges were not the same, but everything else was and
24682469
* we didn't do a variable access into a map then we are a-ok.
24692470
*/
2470-
if (!env->varlen_map_value_access &&
2471+
if (!varlen_map_access &&
24712472
rold->type == rcur->type && rold->imm == rcur->imm)
24722473
continue;
24732474

2475+
/* If we didn't map access then again we don't care about the
2476+
* mismatched range values and it's ok if our old type was
2477+
* UNKNOWN and we didn't go to a NOT_INIT'ed reg.
2478+
*/
24742479
if (rold->type == NOT_INIT ||
2475-
(rold->type == UNKNOWN_VALUE && rcur->type != NOT_INIT))
2480+
(!varlen_map_access && rold->type == UNKNOWN_VALUE &&
2481+
rcur->type != NOT_INIT))
24762482
continue;
24772483

24782484
if (rold->type == PTR_TO_PACKET && rcur->type == PTR_TO_PACKET &&

0 commit comments

Comments
 (0)