public inbox for bpf@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH bpf v6 0/2] bpf: Fix s16 truncation for large bpf-to-bpf call offsets
@ 2026-04-12 17:03 Yazhou Tang
  2026-04-12 17:03 ` [PATCH bpf v6 1/2] " Yazhou Tang
  2026-04-12 17:03 ` [PATCH bpf v6 2/2] selftests/bpf: Add test for large offset bpf-to-bpf call Yazhou Tang
  0 siblings, 2 replies; 7+ messages in thread
From: Yazhou Tang @ 2026-04-12 17:03 UTC (permalink / raw)
  To: bpf, ast, eddyz87, emil, puranjay, xukuohai
  Cc: daniel, john.fastabend, andrii, martin.lau, song, yonghong.song,
	kpsingh, sdf, haoluo, jolsa, tangyazhou518, shenghaoyuan0928,
	ziye

From: Yazhou Tang <tangyazhou518@outlook.com>

This patchset addresses a silent truncation bug in the BPF verifier that
occurs when a bpf-to-bpf call involves a massive relative jump offset.
Because the BPF instruction set utilizes a 32-bit imm field for bpf-to-bpf
calls, implicitly downcasting it to the 16-bit insn->off causes incorrect
call targets or subprog ID resolution for large BPF programs.

Patch 1/2 fixes the interpreter path by keeping the original imm field
unchanged and using the off field to store the interpreter function index
in bpf_patch_call_args(). It also adjusts the JMP_CALL_ARGS case in
___bpf_prog_run() and the dumper code accordingly, while removing a
previous workaround in the selftests disasm helpers.

Patch 2/2 introduces a selftest for this fix. When JIT is disabled, running
the test without this fix triggers a kernel panic due to an invalid call
target caused by the truncation issue.

---

Change log:

v6:
1. Use a different but clearer approach to resolve this issue: keeping
   the original imm field unchanged and using the off field to store the
   interpreter function index. (Kuohai)
2. Update the related dumper code and remove a previous workaround in the
   selftests disasm helpers, which is no longer needed after this fix.

v5: https://lore.kernel.org/bpf/20260326090133.221957-1-tangyazhou@zju.edu.cn/
1. Some minor changes in commit messages. (AI Reviewer)

v4: https://lore.kernel.org/bpf/20260326063329.10031-1-tangyazhou@zju.edu.cn/
1. Remove some redundant commit messages of patch 2/3. (Emil)
2. Change the number of instructions in padding_subprog() from 200,000
   to 32,765, which is the minimum number of instructions required to
   trigger the verifier failure. (Emil)

v3: https://lore.kernel.org/bpf/20260323122254.98540-1-tangyazhou@zju.edu.cn/
1. Resend to fix a typo in v2 and add "Fixes" tag. The rest of the changes
   are identical to v2.

v2 (incorrect): https://lore.kernel.org/bpf/20260323081748.106603-1-tangyazhou@zju.edu.cn/
1. Move the s16 boundary check from fixup_call_args() to bpf_patch_call_args(),
   and change the return type of bpf_patch_call_args() to int. (Emil)
2. Add Patch 3/3 to fix the incorrect subprog ID in dumped bpf_pseudo_call
   instructions, which is caused by the same truncation issue. (Puranjay)
3. Refine the new selftest for clarity and add detailed comments explaining
   the test design. (Emil)

v1: https://lore.kernel.org/bpf/20260316190220.113417-1-tangyazhou@zju.edu.cn/

Yazhou Tang (2):
  bpf: Fix s16 truncation for large bpf-to-bpf call offsets
  selftests/bpf: Add test for large offset bpf-to-bpf call

 include/linux/filter.h                        |  3 --
 kernel/bpf/core.c                             | 10 ++--
 kernel/bpf/verifier.c                         |  6 +--
 tools/bpf/bpftool/xlated_dumper.c             | 10 ++--
 tools/testing/selftests/bpf/disasm_helpers.c  | 18 --------
 .../selftests/bpf/prog_tests/call_large_imm.c | 29 ++++++++++++
 .../selftests/bpf/progs/call_large_imm.c      | 46 +++++++++++++++++++
 7 files changed, 88 insertions(+), 34 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/call_large_imm.c
 create mode 100644 tools/testing/selftests/bpf/progs/call_large_imm.c

-- 
2.53.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-04-20 15:05 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-12 17:03 [PATCH bpf v6 0/2] bpf: Fix s16 truncation for large bpf-to-bpf call offsets Yazhou Tang
2026-04-12 17:03 ` [PATCH bpf v6 1/2] " Yazhou Tang
2026-04-12 20:13   ` Alexei Starovoitov
2026-04-13  2:38     ` Yazhou Tang
2026-04-20  9:21       ` Yazhou Tang
2026-04-20 15:05         ` Alexei Starovoitov
2026-04-12 17:03 ` [PATCH bpf v6 2/2] selftests/bpf: Add test for large offset bpf-to-bpf call Yazhou Tang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox