aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorAlexei Starovoitov <ast@kernel.org>2026-03-03 08:45:16 -0800
committerAlexei Starovoitov <ast@kernel.org>2026-03-03 08:45:16 -0800
commitb0000448094892c9131e485b64be2d5ef62ab73b (patch)
tree817e2fd77f8ec8431d18bea57b8ac8cdf76e6f32 /kernel
parentb1d6bd5462f1e16adb805ce293bd11e9d7c47e6c (diff)
parentf6312e71759ddb10b20fbdb9ee01b9546cabd4e3 (diff)
Merge branch 'allow-fixed-offsets-for-ptr_to_ctx'
Kumar Kartikeya Dwivedi says: ==================== Allow fixed offsets for PTR_TO_CTX Enable pointer modification with constant offsets accumulated in the register for PTR_TO_CTX for programs where it won't be rewritten. See patches for details. ==================== Link: https://patch.msgid.link/20260227005725.1247305-1-memxor@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/bpf/verifier.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index fc4ccd1de569..34f89ed29c47 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -7752,6 +7752,11 @@ static int check_mem_access(struct bpf_verifier_env *env, int insn_idx, u32 regn
if (!err && value_regno >= 0 && (t == BPF_READ || rdonly_mem))
mark_reg_unknown(env, regs, value_regno);
} else if (reg->type == PTR_TO_CTX) {
+ /*
+ * Program types that don't rewrite ctx accesses can safely
+ * dereference ctx pointers with fixed offsets.
+ */
+ bool fixed_off_ok = !env->ops->convert_ctx_access;
struct bpf_retval_range range;
struct bpf_insn_access_aux info = {
.reg_type = SCALAR_VALUE,
@@ -7765,10 +7770,16 @@ static int check_mem_access(struct bpf_verifier_env *env, int insn_idx, u32 regn
return -EACCES;
}
- err = check_ptr_off_reg(env, reg, regno);
+ err = __check_ptr_off_reg(env, reg, regno, fixed_off_ok);
if (err < 0)
return err;
+ /*
+ * Fold the register's constant offset into the insn offset so
+ * that is_valid_access() sees the true effective offset.
+ */
+ if (fixed_off_ok)
+ off += reg->var_off.value;
err = check_ctx_access(env, insn_idx, off, size, t, &info);
if (err)
verbose_linfo(env, insn_idx, "; ");