return 0;
 }
 
-static int bpf_adj_delta_to_imm(struct bpf_insn *insn, u32 pos, u32 delta,
-                               u32 curr, const bool probe_pass)
+static int bpf_adj_delta_to_imm(struct bpf_insn *insn, u32 pos, s32 end_old,
+                               s32 end_new, u32 curr, const bool probe_pass)
 {
        const s64 imm_min = S32_MIN, imm_max = S32_MAX;
+       s32 delta = end_new - end_old;
        s64 imm = insn->imm;
 
-       if (curr < pos && curr + imm + 1 > pos)
+       if (curr < pos && curr + imm + 1 >= end_old)
                imm += delta;
-       else if (curr > pos + delta && curr + imm + 1 <= pos + delta)
+       else if (curr >= end_new && curr + imm + 1 < end_new)
                imm -= delta;
        if (imm < imm_min || imm > imm_max)
                return -ERANGE;
        return 0;
 }
 
-static int bpf_adj_delta_to_off(struct bpf_insn *insn, u32 pos, u32 delta,
-                               u32 curr, const bool probe_pass)
+static int bpf_adj_delta_to_off(struct bpf_insn *insn, u32 pos, s32 end_old,
+                               s32 end_new, u32 curr, const bool probe_pass)
 {
        const s32 off_min = S16_MIN, off_max = S16_MAX;
+       s32 delta = end_new - end_old;
        s32 off = insn->off;
 
-       if (curr < pos && curr + off + 1 > pos)
+       if (curr < pos && curr + off + 1 >= end_old)
                off += delta;
-       else if (curr > pos + delta && curr + off + 1 <= pos + delta)
+       else if (curr >= end_new && curr + off + 1 < end_new)
                off -= delta;
        if (off < off_min || off > off_max)
                return -ERANGE;
        return 0;
 }
 
-static int bpf_adj_branches(struct bpf_prog *prog, u32 pos, u32 delta,
-                           const bool probe_pass)
+static int bpf_adj_branches(struct bpf_prog *prog, u32 pos, s32 end_old,
+                           s32 end_new, const bool probe_pass)
 {
-       u32 i, insn_cnt = prog->len + (probe_pass ? delta : 0);
+       u32 i, insn_cnt = prog->len + (probe_pass ? end_new - end_old : 0);
        struct bpf_insn *insn = prog->insnsi;
        int ret = 0;
 
                 * do any other adjustments. Therefore skip the patchlet.
                 */
                if (probe_pass && i == pos) {
-                       i += delta + 1;
-                       insn++;
+                       i = end_new;
+                       insn = prog->insnsi + end_old;
                }
                code = insn->code;
                if (BPF_CLASS(code) != BPF_JMP ||
                if (BPF_OP(code) == BPF_CALL) {
                        if (insn->src_reg != BPF_PSEUDO_CALL)
                                continue;
-                       ret = bpf_adj_delta_to_imm(insn, pos, delta, i,
-                                                  probe_pass);
+                       ret = bpf_adj_delta_to_imm(insn, pos, end_old,
+                                                  end_new, i, probe_pass);
                } else {
-                       ret = bpf_adj_delta_to_off(insn, pos, delta, i,
-                                                  probe_pass);
+                       ret = bpf_adj_delta_to_off(insn, pos, end_old,
+                                                  end_new, i, probe_pass);
                }
                if (ret)
                        break;
         * we afterwards may not fail anymore.
         */
        if (insn_adj_cnt > cnt_max &&
-           bpf_adj_branches(prog, off, insn_delta, true))
+           bpf_adj_branches(prog, off, off + 1, off + len, true))
                return NULL;
 
        /* Several new instructions need to be inserted. Make room
         * the ship has sailed to reverse to the original state. An
         * overflow cannot happen at this point.
         */
-       BUG_ON(bpf_adj_branches(prog_adj, off, insn_delta, false));
+       BUG_ON(bpf_adj_branches(prog_adj, off, off + 1, off + len, false));
 
        bpf_adj_linfo(prog_adj, off, insn_delta);