aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/bpf/verifier.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/bpf/verifier.c')
-rw-r--r--kernel/bpf/verifier.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 8135cb1077ee..0e742210750e 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -2508,6 +2508,7 @@ static bool states_equal(struct bpf_verifier_env *env,
2508 struct bpf_verifier_state *old, 2508 struct bpf_verifier_state *old,
2509 struct bpf_verifier_state *cur) 2509 struct bpf_verifier_state *cur)
2510{ 2510{
2511 bool varlen_map_access = env->varlen_map_value_access;
2511 struct bpf_reg_state *rold, *rcur; 2512 struct bpf_reg_state *rold, *rcur;
2512 int i; 2513 int i;
2513 2514
@@ -2521,12 +2522,17 @@ static bool states_equal(struct bpf_verifier_env *env,
2521 /* If the ranges were not the same, but everything else was and 2522 /* If the ranges were not the same, but everything else was and
2522 * we didn't do a variable access into a map then we are a-ok. 2523 * we didn't do a variable access into a map then we are a-ok.
2523 */ 2524 */
2524 if (!env->varlen_map_value_access && 2525 if (!varlen_map_access &&
2525 rold->type == rcur->type && rold->imm == rcur->imm) 2526 rold->type == rcur->type && rold->imm == rcur->imm)
2526 continue; 2527 continue;
2527 2528
2529 /* If we didn't map access then again we don't care about the
2530 * mismatched range values and it's ok if our old type was
2531 * UNKNOWN and we didn't go to a NOT_INIT'ed reg.
2532 */
2528 if (rold->type == NOT_INIT || 2533 if (rold->type == NOT_INIT ||
2529 (rold->type == UNKNOWN_VALUE && rcur->type != NOT_INIT)) 2534 (!varlen_map_access && rold->type == UNKNOWN_VALUE &&
2535 rcur->type != NOT_INIT))
2530 continue; 2536 continue;
2531 2537
2532 if (rold->type == PTR_TO_PACKET && rcur->type == PTR_TO_PACKET && 2538 if (rold->type == PTR_TO_PACKET && rcur->type == PTR_TO_PACKET &&