}
 
 /* check %cur's range satisfies %old's */
-static bool range_within(struct bpf_reg_state *old,
-                        struct bpf_reg_state *cur)
+static bool range_within(const struct bpf_reg_state *old,
+                        const struct bpf_reg_state *cur)
 {
        return old->umin_value <= cur->umin_value &&
               old->umax_value >= cur->umax_value &&
               check_ids(rold->ref_obj_id, rcur->ref_obj_id, idmap);
 }
 
+enum exact_level {
+       NOT_EXACT,
+       EXACT,
+       RANGE_WITHIN
+};
+
 /* Returns true if (rold safe implies rcur safe) */
 static bool regsafe(struct bpf_verifier_env *env, struct bpf_reg_state *rold,
-                   struct bpf_reg_state *rcur, struct bpf_idmap *idmap, bool exact)
+                   struct bpf_reg_state *rcur, struct bpf_idmap *idmap,
+                   enum exact_level exact)
 {
-       if (exact)
+       if (exact == EXACT)
                return regs_exact(rold, rcur, idmap);
 
-       if (!(rold->live & REG_LIVE_READ))
+       if (!(rold->live & REG_LIVE_READ) && exact == NOT_EXACT)
                /* explored state didn't use this */
                return true;
-       if (rold->type == NOT_INIT)
-               /* explored state can't have used this */
-               return true;
-       if (rcur->type == NOT_INIT)
-               return false;
+       if (rold->type == NOT_INIT) {
+               if (exact == NOT_EXACT || rcur->type == NOT_INIT)
+                       /* explored state can't have used this */
+                       return true;
+       }
 
        /* Enforce that register types have to match exactly, including their
         * modifiers (like PTR_MAYBE_NULL, MEM_RDONLY, etc), as a general
                        return memcmp(rold, rcur, offsetof(struct bpf_reg_state, id)) == 0 &&
                               check_scalar_ids(rold->id, rcur->id, idmap);
                }
-               if (!rold->precise)
+               if (!rold->precise && exact == NOT_EXACT)
                        return true;
                /* Why check_ids() for scalar registers?
                 *
 }
 
 static bool stacksafe(struct bpf_verifier_env *env, struct bpf_func_state *old,
-                     struct bpf_func_state *cur, struct bpf_idmap *idmap, bool exact)
+                     struct bpf_func_state *cur, struct bpf_idmap *idmap,
+                     enum exact_level exact)
 {
        int i, spi;
 
 
                spi = i / BPF_REG_SIZE;
 
-               if (exact &&
+               if (exact != NOT_EXACT &&
                    old->stack[spi].slot_type[i % BPF_REG_SIZE] !=
                    cur->stack[spi].slot_type[i % BPF_REG_SIZE])
                        return false;
 
-               if (!(old->stack[spi].spilled_ptr.live & REG_LIVE_READ) && !exact) {
+               if (!(old->stack[spi].spilled_ptr.live & REG_LIVE_READ)
+                   && exact == NOT_EXACT) {
                        i += BPF_REG_SIZE - 1;
                        /* explored state didn't use this */
                        continue;
  * the current state will reach 'bpf_exit' instruction safely
  */
 static bool func_states_equal(struct bpf_verifier_env *env, struct bpf_func_state *old,
-                             struct bpf_func_state *cur, bool exact)
+                             struct bpf_func_state *cur, enum exact_level exact)
 {
        int i;
 
 static bool states_equal(struct bpf_verifier_env *env,
                         struct bpf_verifier_state *old,
                         struct bpf_verifier_state *cur,
-                        bool exact)
+                        enum exact_level exact)
 {
        int i;
 
                         * => unsafe memory access at 11 would not be caught.
                         */
                        if (is_iter_next_insn(env, insn_idx)) {
-                               if (states_equal(env, &sl->state, cur, true)) {
+                               if (states_equal(env, &sl->state, cur, RANGE_WITHIN)) {
                                        struct bpf_func_state *cur_frame;
                                        struct bpf_reg_state *iter_state, *iter_reg;
                                        int spi;
                                goto skip_inf_loop_check;
                        }
                        if (is_may_goto_insn_at(env, insn_idx)) {
-                               if (states_equal(env, &sl->state, cur, true)) {
+                               if (states_equal(env, &sl->state, cur, RANGE_WITHIN)) {
                                        update_loop_entry(cur, &sl->state);
                                        goto hit;
                                }
                                goto skip_inf_loop_check;
                        }
                        if (calls_callback(env, insn_idx)) {
-                               if (states_equal(env, &sl->state, cur, true))
+                               if (states_equal(env, &sl->state, cur, RANGE_WITHIN))
                                        goto hit;
                                goto skip_inf_loop_check;
                        }
                        /* attempt to detect infinite loop to avoid unnecessary doomed work */
                        if (states_maybe_looping(&sl->state, cur) &&
-                           states_equal(env, &sl->state, cur, true) &&
+                           states_equal(env, &sl->state, cur, EXACT) &&
                            !iter_active_depths_differ(&sl->state, cur) &&
                            sl->state.may_goto_depth == cur->may_goto_depth &&
                            sl->state.callback_unroll_depth == cur->callback_unroll_depth) {
                 */
                loop_entry = get_loop_entry(&sl->state);
                force_exact = loop_entry && loop_entry->branches > 0;
-               if (states_equal(env, &sl->state, cur, force_exact)) {
+               if (states_equal(env, &sl->state, cur, force_exact ? RANGE_WITHIN : NOT_EXACT)) {
                        if (force_exact)
                                update_loop_entry(cur, loop_entry);
 hit: