Thread (17 messages) 17 messages, 7 authors, 2026-03-23

Re: [PATCH bpf-next v9 1/5] bpf: Move constants blinding out of arch-specific JITs

From: Xu Kuohai <xukuohai@huaweicloud.com>
Date: 2026-03-13 02:32:24
Also in: bpf, lkml

On 3/13/2026 1:50 AM, bot+bpf-ci@kernel.org wrote:
quoted
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 4fbacd2149cd..3ccefd13121b 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
[ ... ]
quoted
@@ -22843,17 +22843,23 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)

  static int jit_subprogs(struct bpf_verifier_env *env)
  {
-	struct bpf_prog *prog = env->prog, **func, *tmp;
+	struct bpf_prog *orig_prog = env->prog, *prog, **func, *tmp;
  	int i, j, subprog_start, subprog_end = 0, len, subprog;
  	struct bpf_map *map_ptr;
  	struct bpf_insn *insn;
  	void *old_bpf_func;
  	int err, num_exentries;
-	int old_len, subprog_start_adjustment = 0;
+	bool blinded = false;

  	if (env->subprog_cnt <= 1)
  		return 0;

+	prog = bpf_jit_blind_constants(env, NULL);
+	if (IS_ERR(prog))
+		return -ENOMEM;
+	if (prog != orig_prog)
+		blinded = true;
When env is non-NULL, bpf_jit_blind_constants() uses
bpf_patch_insn_data() to insert blinding instructions.
bpf_patch_insn_data() calls adjust_insn_aux_data(), which expands
and shifts entries in env->insn_aux_data to match the now-longer
blinded program.
quoted
+
  	for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
[ ... ]
quoted
@@ -23114,6 +23122,10 @@ static int jit_subprogs(struct bpf_verifier_env *env)
  	}
  	kfree(func);
  out_undo_insn:
+	if (blinded) {
+		bpf_jit_prog_release_other(orig_prog, prog);
+		env->prog = prog = orig_prog;
+	}
  	/* cleanup main prog to be interpreted */
  	prog->jit_requested = 0;
  	prog->blinding_requested = 0;
+	for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
  		if (!bpf_pseudo_call(insn))
  			continue;
  		insn->off = 0;
  		insn->imm = env->insn_aux_data[i].call_imm;
  	}
After bpf_jit_prog_release_other() reverts to orig_prog, this loop
iterates using the original program's indices and length. However,
env->insn_aux_data was expanded and shifted by bpf_patch_insn_data()
during blinding to match the blinded program's instruction count.

The call_imm values were saved at blinded indices (earlier in
jit_subprogs, after the bpf_jit_blind_constants call), so reading
them back at original indices gets the wrong aux data entries.

On !CONFIG_BPF_JIT_ALWAYS_ON configs, could this cause incorrect
imm values to be restored into pseudo_call instructions, breaking
interpreter fallback?
Right, I overlooked that insn_aux_data is used here. In fact, when
blinded is true, we have rolled back to the clean, original program,
so there is no need to restore call_imm.
---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md

CI run summary: https://github.com/kernel-patches/bpf/actions/runs/23013190773
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help