* kernel/bpf/fixups.c:808 bpf_convert_ctx_accesses() error: __builtin_memcpy() 'insn_buf' too small (256 vs u32max)
@ 2026-08-13 7:01 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2026-08-13 7:01 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Alexei Starovoitov <ast@kernel.org>
Hi Alexei,
FYI, the error/warning was bisected to this commit, please ignore it if it's irrelevant.
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: f5bbbfec59b4e2fb7520a91de3df8a6174325d6a
commit: 449f08fa59dda5da40317b6976604b877c4ecd63 bpf: Move fixup/post-processing logic from verifier.c into fixups.c
date: 4 months ago
:::::: branch date: 2 days ago
:::::: commit date: 4 months ago
config: sparc-randconfig-r072-20260813 (https://download.01.org/0day-ci/archive/20260813/202608131415.vmjjc9qt-lkp@intel.com/config)
compiler: sparc-linux-gcc (GCC) 13.4.0
smatch: v0.5.0-9187-g5189e3fb
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Fixes: 449f08fa59dd ("bpf: Move fixup/post-processing logic from verifier.c into fixups.c")
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202608131415.vmjjc9qt-lkp@intel.com/
smatch warnings:
kernel/bpf/fixups.c:808 bpf_convert_ctx_accesses() error: __builtin_memcpy() 'insn_buf' too small (256 vs u32max)
kernel/bpf/fixups.c:808 bpf_convert_ctx_accesses() error: __builtin_memcpy() 'epilogue_buf' too small (256 vs u32max)
vim +/insn_buf +808 kernel/bpf/fixups.c
449f08fa59dda5 Alexei Starovoitov 2026-04-12 670
449f08fa59dda5 Alexei Starovoitov 2026-04-12 671 /* convert load instructions that access fields of a context type into a
449f08fa59dda5 Alexei Starovoitov 2026-04-12 672 * sequence of instructions that access fields of the underlying structure:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 673 * struct __sk_buff -> struct sk_buff
449f08fa59dda5 Alexei Starovoitov 2026-04-12 674 * struct bpf_sock_ops -> struct sock
449f08fa59dda5 Alexei Starovoitov 2026-04-12 675 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12 676 int bpf_convert_ctx_accesses(struct bpf_verifier_env *env)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 677 {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 678 struct bpf_subprog_info *subprogs = env->subprog_info;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 679 const struct bpf_verifier_ops *ops = env->ops;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 680 int i, cnt, size, ctx_field_size, ret, delta = 0, epilogue_cnt = 0;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 681 const int insn_cnt = env->prog->len;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 682 struct bpf_insn *epilogue_buf = env->epilogue_buf;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 683 struct bpf_insn *insn_buf = env->insn_buf;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 684 struct bpf_insn *insn;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 685 u32 target_size, size_default, off;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 686 struct bpf_prog *new_prog;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 687 enum bpf_access_type type;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 688 bool is_narrower_load;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 689 int epilogue_idx = 0;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 690
449f08fa59dda5 Alexei Starovoitov 2026-04-12 691 if (ops->gen_epilogue) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 692 epilogue_cnt = ops->gen_epilogue(epilogue_buf, env->prog,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 693 -(subprogs[0].stack_depth + 8));
449f08fa59dda5 Alexei Starovoitov 2026-04-12 694 if (epilogue_cnt >= INSN_BUF_SIZE) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 695 verifier_bug(env, "epilogue is too long");
449f08fa59dda5 Alexei Starovoitov 2026-04-12 696 return -EFAULT;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 697 } else if (epilogue_cnt) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 698 /* Save the ARG_PTR_TO_CTX for the epilogue to use */
449f08fa59dda5 Alexei Starovoitov 2026-04-12 699 cnt = 0;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 700 subprogs[0].stack_depth += 8;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 701 insn_buf[cnt++] = BPF_STX_MEM(BPF_DW, BPF_REG_FP, BPF_REG_1,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 702 -subprogs[0].stack_depth);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 703 insn_buf[cnt++] = env->prog->insnsi[0];
449f08fa59dda5 Alexei Starovoitov 2026-04-12 704 new_prog = bpf_patch_insn_data(env, 0, insn_buf, cnt);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 705 if (!new_prog)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 706 return -ENOMEM;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 707 env->prog = new_prog;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 708 delta += cnt - 1;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 709
449f08fa59dda5 Alexei Starovoitov 2026-04-12 710 ret = add_kfunc_in_insns(env, epilogue_buf, epilogue_cnt - 1);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 711 if (ret < 0)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 712 return ret;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 713 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 714 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 715
449f08fa59dda5 Alexei Starovoitov 2026-04-12 716 if (ops->gen_prologue || env->seen_direct_write) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 717 if (!ops->gen_prologue) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 718 verifier_bug(env, "gen_prologue is null");
449f08fa59dda5 Alexei Starovoitov 2026-04-12 719 return -EFAULT;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 720 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 721 cnt = ops->gen_prologue(insn_buf, env->seen_direct_write,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 722 env->prog);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 723 if (cnt >= INSN_BUF_SIZE) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 724 verifier_bug(env, "prologue is too long");
449f08fa59dda5 Alexei Starovoitov 2026-04-12 725 return -EFAULT;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 726 } else if (cnt) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 727 new_prog = bpf_patch_insn_data(env, 0, insn_buf, cnt);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 728 if (!new_prog)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 729 return -ENOMEM;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 730
449f08fa59dda5 Alexei Starovoitov 2026-04-12 731 env->prog = new_prog;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 732 delta += cnt - 1;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 733
449f08fa59dda5 Alexei Starovoitov 2026-04-12 734 ret = add_kfunc_in_insns(env, insn_buf, cnt - 1);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 735 if (ret < 0)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 736 return ret;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 737 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 738 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 739
449f08fa59dda5 Alexei Starovoitov 2026-04-12 740 if (delta)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 741 WARN_ON(adjust_jmp_off(env->prog, 0, delta));
449f08fa59dda5 Alexei Starovoitov 2026-04-12 742
449f08fa59dda5 Alexei Starovoitov 2026-04-12 743 if (bpf_prog_is_offloaded(env->prog->aux))
449f08fa59dda5 Alexei Starovoitov 2026-04-12 744 return 0;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 745
449f08fa59dda5 Alexei Starovoitov 2026-04-12 746 insn = env->prog->insnsi + delta;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 747
449f08fa59dda5 Alexei Starovoitov 2026-04-12 748 for (i = 0; i < insn_cnt; i++, insn++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 749 bpf_convert_ctx_access_t convert_ctx_access;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 750 u8 mode;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 751
449f08fa59dda5 Alexei Starovoitov 2026-04-12 752 if (env->insn_aux_data[i + delta].nospec) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 753 WARN_ON_ONCE(env->insn_aux_data[i + delta].alu_state);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 754 struct bpf_insn *patch = insn_buf;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 755
449f08fa59dda5 Alexei Starovoitov 2026-04-12 756 *patch++ = BPF_ST_NOSPEC();
449f08fa59dda5 Alexei Starovoitov 2026-04-12 757 *patch++ = *insn;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 758 cnt = patch - insn_buf;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 759 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 760 if (!new_prog)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 761 return -ENOMEM;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 762
449f08fa59dda5 Alexei Starovoitov 2026-04-12 763 delta += cnt - 1;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 764 env->prog = new_prog;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 765 insn = new_prog->insnsi + i + delta;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 766 /* This can not be easily merged with the
449f08fa59dda5 Alexei Starovoitov 2026-04-12 767 * nospec_result-case, because an insn may require a
449f08fa59dda5 Alexei Starovoitov 2026-04-12 768 * nospec before and after itself. Therefore also do not
449f08fa59dda5 Alexei Starovoitov 2026-04-12 769 * 'continue' here but potentially apply further
449f08fa59dda5 Alexei Starovoitov 2026-04-12 770 * patching to insn. *insn should equal patch[1] now.
449f08fa59dda5 Alexei Starovoitov 2026-04-12 771 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12 772 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 773
449f08fa59dda5 Alexei Starovoitov 2026-04-12 774 if (insn->code == (BPF_LDX | BPF_MEM | BPF_B) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 775 insn->code == (BPF_LDX | BPF_MEM | BPF_H) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 776 insn->code == (BPF_LDX | BPF_MEM | BPF_W) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 777 insn->code == (BPF_LDX | BPF_MEM | BPF_DW) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 778 insn->code == (BPF_LDX | BPF_MEMSX | BPF_B) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 779 insn->code == (BPF_LDX | BPF_MEMSX | BPF_H) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 780 insn->code == (BPF_LDX | BPF_MEMSX | BPF_W)) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 781 type = BPF_READ;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 782 } else if (insn->code == (BPF_STX | BPF_MEM | BPF_B) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 783 insn->code == (BPF_STX | BPF_MEM | BPF_H) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 784 insn->code == (BPF_STX | BPF_MEM | BPF_W) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 785 insn->code == (BPF_STX | BPF_MEM | BPF_DW) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 786 insn->code == (BPF_ST | BPF_MEM | BPF_B) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 787 insn->code == (BPF_ST | BPF_MEM | BPF_H) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 788 insn->code == (BPF_ST | BPF_MEM | BPF_W) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 789 insn->code == (BPF_ST | BPF_MEM | BPF_DW)) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 790 type = BPF_WRITE;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 791 } else if ((insn->code == (BPF_STX | BPF_ATOMIC | BPF_B) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 792 insn->code == (BPF_STX | BPF_ATOMIC | BPF_H) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 793 insn->code == (BPF_STX | BPF_ATOMIC | BPF_W) ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 794 insn->code == (BPF_STX | BPF_ATOMIC | BPF_DW)) &&
449f08fa59dda5 Alexei Starovoitov 2026-04-12 795 env->insn_aux_data[i + delta].ptr_type == PTR_TO_ARENA) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 796 insn->code = BPF_STX | BPF_PROBE_ATOMIC | BPF_SIZE(insn->code);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 797 env->prog->aux->num_exentries++;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 798 continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 799 } else if (insn->code == (BPF_JMP | BPF_EXIT) &&
449f08fa59dda5 Alexei Starovoitov 2026-04-12 800 epilogue_cnt &&
449f08fa59dda5 Alexei Starovoitov 2026-04-12 801 i + delta < subprogs[1].start) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 802 /* Generate epilogue for the main prog */
449f08fa59dda5 Alexei Starovoitov 2026-04-12 803 if (epilogue_idx) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 804 /* jump back to the earlier generated epilogue */
449f08fa59dda5 Alexei Starovoitov 2026-04-12 805 insn_buf[0] = BPF_JMP32_A(epilogue_idx - i - delta - 1);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 806 cnt = 1;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 807 } else {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 @808 memcpy(insn_buf, epilogue_buf,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 809 epilogue_cnt * sizeof(*epilogue_buf));
449f08fa59dda5 Alexei Starovoitov 2026-04-12 810 cnt = epilogue_cnt;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 811 /* epilogue_idx cannot be 0. It must have at
449f08fa59dda5 Alexei Starovoitov 2026-04-12 812 * least one ctx ptr saving insn before the
449f08fa59dda5 Alexei Starovoitov 2026-04-12 813 * epilogue.
449f08fa59dda5 Alexei Starovoitov 2026-04-12 814 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12 815 epilogue_idx = i + delta;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 816 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 817 goto patch_insn_buf;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 818 } else {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 819 continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 820 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 821
449f08fa59dda5 Alexei Starovoitov 2026-04-12 822 if (type == BPF_WRITE &&
449f08fa59dda5 Alexei Starovoitov 2026-04-12 823 env->insn_aux_data[i + delta].nospec_result) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 824 /* nospec_result is only used to mitigate Spectre v4 and
449f08fa59dda5 Alexei Starovoitov 2026-04-12 825 * to limit verification-time for Spectre v1.
449f08fa59dda5 Alexei Starovoitov 2026-04-12 826 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12 827 struct bpf_insn *patch = insn_buf;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 828
449f08fa59dda5 Alexei Starovoitov 2026-04-12 829 *patch++ = *insn;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 830 *patch++ = BPF_ST_NOSPEC();
449f08fa59dda5 Alexei Starovoitov 2026-04-12 831 cnt = patch - insn_buf;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 832 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 833 if (!new_prog)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 834 return -ENOMEM;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 835
449f08fa59dda5 Alexei Starovoitov 2026-04-12 836 delta += cnt - 1;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 837 env->prog = new_prog;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 838 insn = new_prog->insnsi + i + delta;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 839 continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 840 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 841
449f08fa59dda5 Alexei Starovoitov 2026-04-12 842 switch ((int)env->insn_aux_data[i + delta].ptr_type) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 843 case PTR_TO_CTX:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 844 if (!ops->convert_ctx_access)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 845 continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 846 convert_ctx_access = ops->convert_ctx_access;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 847 break;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 848 case PTR_TO_SOCKET:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 849 case PTR_TO_SOCK_COMMON:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 850 convert_ctx_access = bpf_sock_convert_ctx_access;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 851 break;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 852 case PTR_TO_TCP_SOCK:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 853 convert_ctx_access = bpf_tcp_sock_convert_ctx_access;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 854 break;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 855 case PTR_TO_XDP_SOCK:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 856 convert_ctx_access = bpf_xdp_sock_convert_ctx_access;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 857 break;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 858 case PTR_TO_BTF_ID:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 859 case PTR_TO_BTF_ID | PTR_UNTRUSTED:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 860 /* PTR_TO_BTF_ID | MEM_ALLOC always has a valid lifetime, unlike
449f08fa59dda5 Alexei Starovoitov 2026-04-12 861 * PTR_TO_BTF_ID, and an active ref_obj_id, but the same cannot
449f08fa59dda5 Alexei Starovoitov 2026-04-12 862 * be said once it is marked PTR_UNTRUSTED, hence we must handle
449f08fa59dda5 Alexei Starovoitov 2026-04-12 863 * any faults for loads into such types. BPF_WRITE is disallowed
449f08fa59dda5 Alexei Starovoitov 2026-04-12 864 * for this case.
449f08fa59dda5 Alexei Starovoitov 2026-04-12 865 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12 866 case PTR_TO_BTF_ID | MEM_ALLOC | PTR_UNTRUSTED:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 867 case PTR_TO_MEM | MEM_RDONLY | PTR_UNTRUSTED:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 868 if (type == BPF_READ) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 869 if (BPF_MODE(insn->code) == BPF_MEM)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 870 insn->code = BPF_LDX | BPF_PROBE_MEM |
449f08fa59dda5 Alexei Starovoitov 2026-04-12 871 BPF_SIZE((insn)->code);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 872 else
449f08fa59dda5 Alexei Starovoitov 2026-04-12 873 insn->code = BPF_LDX | BPF_PROBE_MEMSX |
449f08fa59dda5 Alexei Starovoitov 2026-04-12 874 BPF_SIZE((insn)->code);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 875 env->prog->aux->num_exentries++;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 876 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 877 continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 878 case PTR_TO_ARENA:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 879 if (BPF_MODE(insn->code) == BPF_MEMSX) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 880 if (!bpf_jit_supports_insn(insn, true)) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 881 verbose(env, "sign extending loads from arena are not supported yet\n");
449f08fa59dda5 Alexei Starovoitov 2026-04-12 882 return -EOPNOTSUPP;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 883 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 884 insn->code = BPF_CLASS(insn->code) | BPF_PROBE_MEM32SX | BPF_SIZE(insn->code);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 885 } else {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 886 insn->code = BPF_CLASS(insn->code) | BPF_PROBE_MEM32 | BPF_SIZE(insn->code);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 887 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 888 env->prog->aux->num_exentries++;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 889 continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 890 default:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 891 continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 892 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 893
449f08fa59dda5 Alexei Starovoitov 2026-04-12 894 ctx_field_size = env->insn_aux_data[i + delta].ctx_field_size;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 895 size = BPF_LDST_BYTES(insn);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 896 mode = BPF_MODE(insn->code);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 897
449f08fa59dda5 Alexei Starovoitov 2026-04-12 898 /* If the read access is a narrower load of the field,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 899 * convert to a 4/8-byte load, to minimum program type specific
449f08fa59dda5 Alexei Starovoitov 2026-04-12 900 * convert_ctx_access changes. If conversion is successful,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 901 * we will apply proper mask to the result.
449f08fa59dda5 Alexei Starovoitov 2026-04-12 902 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12 903 is_narrower_load = size < ctx_field_size;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 904 size_default = bpf_ctx_off_adjust_machine(ctx_field_size);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 905 off = insn->off;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 906 if (is_narrower_load) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 907 u8 size_code;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 908
449f08fa59dda5 Alexei Starovoitov 2026-04-12 909 if (type == BPF_WRITE) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 910 verifier_bug(env, "narrow ctx access misconfigured");
449f08fa59dda5 Alexei Starovoitov 2026-04-12 911 return -EFAULT;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 912 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 913
449f08fa59dda5 Alexei Starovoitov 2026-04-12 914 size_code = BPF_H;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 915 if (ctx_field_size == 4)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 916 size_code = BPF_W;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 917 else if (ctx_field_size == 8)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 918 size_code = BPF_DW;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 919
449f08fa59dda5 Alexei Starovoitov 2026-04-12 920 insn->off = off & ~(size_default - 1);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 921 insn->code = BPF_LDX | BPF_MEM | size_code;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 922 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 923
449f08fa59dda5 Alexei Starovoitov 2026-04-12 924 target_size = 0;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 925 cnt = convert_ctx_access(type, insn, insn_buf, env->prog,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 926 &target_size);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 927 if (cnt == 0 || cnt >= INSN_BUF_SIZE ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12 928 (ctx_field_size && !target_size)) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 929 verifier_bug(env, "error during ctx access conversion (%d)", cnt);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 930 return -EFAULT;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 931 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 932
449f08fa59dda5 Alexei Starovoitov 2026-04-12 933 if (is_narrower_load && size < target_size) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 934 u8 shift = bpf_ctx_narrow_access_offset(
449f08fa59dda5 Alexei Starovoitov 2026-04-12 935 off, size, size_default) * 8;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 936 if (shift && cnt + 1 >= INSN_BUF_SIZE) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 937 verifier_bug(env, "narrow ctx load misconfigured");
449f08fa59dda5 Alexei Starovoitov 2026-04-12 938 return -EFAULT;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 939 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 940 if (ctx_field_size <= 4) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 941 if (shift)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 942 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_RSH,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 943 insn->dst_reg,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 944 shift);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 945 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_AND, insn->dst_reg,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 946 (1 << size * 8) - 1);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 947 } else {
449f08fa59dda5 Alexei Starovoitov 2026-04-12 948 if (shift)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 949 insn_buf[cnt++] = BPF_ALU64_IMM(BPF_RSH,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 950 insn->dst_reg,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 951 shift);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 952 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_AND, insn->dst_reg,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 953 (1ULL << size * 8) - 1);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 954 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 955 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 956 if (mode == BPF_MEMSX)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 957 insn_buf[cnt++] = BPF_RAW_INSN(BPF_ALU64 | BPF_MOV | BPF_X,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 958 insn->dst_reg, insn->dst_reg,
449f08fa59dda5 Alexei Starovoitov 2026-04-12 959 size * 8, 0);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 960
449f08fa59dda5 Alexei Starovoitov 2026-04-12 961 patch_insn_buf:
449f08fa59dda5 Alexei Starovoitov 2026-04-12 962 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
449f08fa59dda5 Alexei Starovoitov 2026-04-12 963 if (!new_prog)
449f08fa59dda5 Alexei Starovoitov 2026-04-12 964 return -ENOMEM;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 965
449f08fa59dda5 Alexei Starovoitov 2026-04-12 966 delta += cnt - 1;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 967
449f08fa59dda5 Alexei Starovoitov 2026-04-12 968 /* keep walking new program and skip insns we just inserted */
449f08fa59dda5 Alexei Starovoitov 2026-04-12 969 env->prog = new_prog;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 970 insn = new_prog->insnsi + i + delta;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 971 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 972
449f08fa59dda5 Alexei Starovoitov 2026-04-12 973 return 0;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 974 }
449f08fa59dda5 Alexei Starovoitov 2026-04-12 975
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread* kernel/bpf/fixups.c:808 bpf_convert_ctx_accesses() error: __builtin_memcpy() 'insn_buf' too small (256 vs u32max)
@ 2026-04-30 19:24 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2026-04-30 19:24 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Alexei Starovoitov <ast@kernel.org>
Hi Alexei,
FYI, the error/warning was bisected to this commit, please ignore it if it's irrelevant.
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: e75a43c7cec459a07d91ed17de4de13ede2b7758
commit: 449f08fa59dda5da40317b6976604b877c4ecd63 bpf: Move fixup/post-processing logic from verifier.c into fixups.c
date: 3 weeks ago
:::::: branch date: 14 hours ago
:::::: commit date: 3 weeks ago
config: sparc-randconfig-r072-20260430 (https://download.01.org/0day-ci/archive/20260501/202605010328.WP97t2ia-lkp@intel.com/config)
compiler: sparc-linux-gcc (GCC) 8.5.0
smatch: v0.5.0-9065-ge9cc34fd
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Fixes: 449f08fa59dd ("bpf: Move fixup/post-processing logic from verifier.c into fixups.c")
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202605010328.WP97t2ia-lkp@intel.com/
smatch warnings:
kernel/bpf/fixups.c:808 bpf_convert_ctx_accesses() error: __builtin_memcpy() 'insn_buf' too small (256 vs u32max)
kernel/bpf/fixups.c:808 bpf_convert_ctx_accesses() error: __builtin_memcpy() 'epilogue_buf' too small (256 vs u32max)
vim +/insn_buf +808 kernel/bpf/fixups.c
449f08fa59dda5d Alexei Starovoitov 2026-04-12 670
449f08fa59dda5d Alexei Starovoitov 2026-04-12 671 /* convert load instructions that access fields of a context type into a
449f08fa59dda5d Alexei Starovoitov 2026-04-12 672 * sequence of instructions that access fields of the underlying structure:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 673 * struct __sk_buff -> struct sk_buff
449f08fa59dda5d Alexei Starovoitov 2026-04-12 674 * struct bpf_sock_ops -> struct sock
449f08fa59dda5d Alexei Starovoitov 2026-04-12 675 */
449f08fa59dda5d Alexei Starovoitov 2026-04-12 676 int bpf_convert_ctx_accesses(struct bpf_verifier_env *env)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 677 {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 678 struct bpf_subprog_info *subprogs = env->subprog_info;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 679 const struct bpf_verifier_ops *ops = env->ops;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 680 int i, cnt, size, ctx_field_size, ret, delta = 0, epilogue_cnt = 0;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 681 const int insn_cnt = env->prog->len;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 682 struct bpf_insn *epilogue_buf = env->epilogue_buf;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 683 struct bpf_insn *insn_buf = env->insn_buf;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 684 struct bpf_insn *insn;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 685 u32 target_size, size_default, off;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 686 struct bpf_prog *new_prog;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 687 enum bpf_access_type type;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 688 bool is_narrower_load;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 689 int epilogue_idx = 0;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 690
449f08fa59dda5d Alexei Starovoitov 2026-04-12 691 if (ops->gen_epilogue) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 692 epilogue_cnt = ops->gen_epilogue(epilogue_buf, env->prog,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 693 -(subprogs[0].stack_depth + 8));
449f08fa59dda5d Alexei Starovoitov 2026-04-12 694 if (epilogue_cnt >= INSN_BUF_SIZE) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 695 verifier_bug(env, "epilogue is too long");
449f08fa59dda5d Alexei Starovoitov 2026-04-12 696 return -EFAULT;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 697 } else if (epilogue_cnt) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 698 /* Save the ARG_PTR_TO_CTX for the epilogue to use */
449f08fa59dda5d Alexei Starovoitov 2026-04-12 699 cnt = 0;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 700 subprogs[0].stack_depth += 8;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 701 insn_buf[cnt++] = BPF_STX_MEM(BPF_DW, BPF_REG_FP, BPF_REG_1,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 702 -subprogs[0].stack_depth);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 703 insn_buf[cnt++] = env->prog->insnsi[0];
449f08fa59dda5d Alexei Starovoitov 2026-04-12 704 new_prog = bpf_patch_insn_data(env, 0, insn_buf, cnt);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 705 if (!new_prog)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 706 return -ENOMEM;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 707 env->prog = new_prog;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 708 delta += cnt - 1;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 709
449f08fa59dda5d Alexei Starovoitov 2026-04-12 710 ret = add_kfunc_in_insns(env, epilogue_buf, epilogue_cnt - 1);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 711 if (ret < 0)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 712 return ret;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 713 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 714 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 715
449f08fa59dda5d Alexei Starovoitov 2026-04-12 716 if (ops->gen_prologue || env->seen_direct_write) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 717 if (!ops->gen_prologue) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 718 verifier_bug(env, "gen_prologue is null");
449f08fa59dda5d Alexei Starovoitov 2026-04-12 719 return -EFAULT;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 720 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 721 cnt = ops->gen_prologue(insn_buf, env->seen_direct_write,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 722 env->prog);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 723 if (cnt >= INSN_BUF_SIZE) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 724 verifier_bug(env, "prologue is too long");
449f08fa59dda5d Alexei Starovoitov 2026-04-12 725 return -EFAULT;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 726 } else if (cnt) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 727 new_prog = bpf_patch_insn_data(env, 0, insn_buf, cnt);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 728 if (!new_prog)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 729 return -ENOMEM;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 730
449f08fa59dda5d Alexei Starovoitov 2026-04-12 731 env->prog = new_prog;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 732 delta += cnt - 1;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 733
449f08fa59dda5d Alexei Starovoitov 2026-04-12 734 ret = add_kfunc_in_insns(env, insn_buf, cnt - 1);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 735 if (ret < 0)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 736 return ret;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 737 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 738 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 739
449f08fa59dda5d Alexei Starovoitov 2026-04-12 740 if (delta)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 741 WARN_ON(adjust_jmp_off(env->prog, 0, delta));
449f08fa59dda5d Alexei Starovoitov 2026-04-12 742
449f08fa59dda5d Alexei Starovoitov 2026-04-12 743 if (bpf_prog_is_offloaded(env->prog->aux))
449f08fa59dda5d Alexei Starovoitov 2026-04-12 744 return 0;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 745
449f08fa59dda5d Alexei Starovoitov 2026-04-12 746 insn = env->prog->insnsi + delta;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 747
449f08fa59dda5d Alexei Starovoitov 2026-04-12 748 for (i = 0; i < insn_cnt; i++, insn++) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 749 bpf_convert_ctx_access_t convert_ctx_access;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 750 u8 mode;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 751
449f08fa59dda5d Alexei Starovoitov 2026-04-12 752 if (env->insn_aux_data[i + delta].nospec) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 753 WARN_ON_ONCE(env->insn_aux_data[i + delta].alu_state);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 754 struct bpf_insn *patch = insn_buf;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 755
449f08fa59dda5d Alexei Starovoitov 2026-04-12 756 *patch++ = BPF_ST_NOSPEC();
449f08fa59dda5d Alexei Starovoitov 2026-04-12 757 *patch++ = *insn;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 758 cnt = patch - insn_buf;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 759 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 760 if (!new_prog)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 761 return -ENOMEM;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 762
449f08fa59dda5d Alexei Starovoitov 2026-04-12 763 delta += cnt - 1;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 764 env->prog = new_prog;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 765 insn = new_prog->insnsi + i + delta;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 766 /* This can not be easily merged with the
449f08fa59dda5d Alexei Starovoitov 2026-04-12 767 * nospec_result-case, because an insn may require a
449f08fa59dda5d Alexei Starovoitov 2026-04-12 768 * nospec before and after itself. Therefore also do not
449f08fa59dda5d Alexei Starovoitov 2026-04-12 769 * 'continue' here but potentially apply further
449f08fa59dda5d Alexei Starovoitov 2026-04-12 770 * patching to insn. *insn should equal patch[1] now.
449f08fa59dda5d Alexei Starovoitov 2026-04-12 771 */
449f08fa59dda5d Alexei Starovoitov 2026-04-12 772 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 773
449f08fa59dda5d Alexei Starovoitov 2026-04-12 774 if (insn->code == (BPF_LDX | BPF_MEM | BPF_B) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 775 insn->code == (BPF_LDX | BPF_MEM | BPF_H) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 776 insn->code == (BPF_LDX | BPF_MEM | BPF_W) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 777 insn->code == (BPF_LDX | BPF_MEM | BPF_DW) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 778 insn->code == (BPF_LDX | BPF_MEMSX | BPF_B) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 779 insn->code == (BPF_LDX | BPF_MEMSX | BPF_H) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 780 insn->code == (BPF_LDX | BPF_MEMSX | BPF_W)) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 781 type = BPF_READ;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 782 } else if (insn->code == (BPF_STX | BPF_MEM | BPF_B) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 783 insn->code == (BPF_STX | BPF_MEM | BPF_H) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 784 insn->code == (BPF_STX | BPF_MEM | BPF_W) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 785 insn->code == (BPF_STX | BPF_MEM | BPF_DW) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 786 insn->code == (BPF_ST | BPF_MEM | BPF_B) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 787 insn->code == (BPF_ST | BPF_MEM | BPF_H) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 788 insn->code == (BPF_ST | BPF_MEM | BPF_W) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 789 insn->code == (BPF_ST | BPF_MEM | BPF_DW)) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 790 type = BPF_WRITE;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 791 } else if ((insn->code == (BPF_STX | BPF_ATOMIC | BPF_B) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 792 insn->code == (BPF_STX | BPF_ATOMIC | BPF_H) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 793 insn->code == (BPF_STX | BPF_ATOMIC | BPF_W) ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 794 insn->code == (BPF_STX | BPF_ATOMIC | BPF_DW)) &&
449f08fa59dda5d Alexei Starovoitov 2026-04-12 795 env->insn_aux_data[i + delta].ptr_type == PTR_TO_ARENA) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 796 insn->code = BPF_STX | BPF_PROBE_ATOMIC | BPF_SIZE(insn->code);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 797 env->prog->aux->num_exentries++;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 798 continue;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 799 } else if (insn->code == (BPF_JMP | BPF_EXIT) &&
449f08fa59dda5d Alexei Starovoitov 2026-04-12 800 epilogue_cnt &&
449f08fa59dda5d Alexei Starovoitov 2026-04-12 801 i + delta < subprogs[1].start) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 802 /* Generate epilogue for the main prog */
449f08fa59dda5d Alexei Starovoitov 2026-04-12 803 if (epilogue_idx) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 804 /* jump back to the earlier generated epilogue */
449f08fa59dda5d Alexei Starovoitov 2026-04-12 805 insn_buf[0] = BPF_JMP32_A(epilogue_idx - i - delta - 1);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 806 cnt = 1;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 807 } else {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 @808 memcpy(insn_buf, epilogue_buf,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 809 epilogue_cnt * sizeof(*epilogue_buf));
449f08fa59dda5d Alexei Starovoitov 2026-04-12 810 cnt = epilogue_cnt;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 811 /* epilogue_idx cannot be 0. It must have at
449f08fa59dda5d Alexei Starovoitov 2026-04-12 812 * least one ctx ptr saving insn before the
449f08fa59dda5d Alexei Starovoitov 2026-04-12 813 * epilogue.
449f08fa59dda5d Alexei Starovoitov 2026-04-12 814 */
449f08fa59dda5d Alexei Starovoitov 2026-04-12 815 epilogue_idx = i + delta;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 816 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 817 goto patch_insn_buf;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 818 } else {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 819 continue;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 820 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 821
449f08fa59dda5d Alexei Starovoitov 2026-04-12 822 if (type == BPF_WRITE &&
449f08fa59dda5d Alexei Starovoitov 2026-04-12 823 env->insn_aux_data[i + delta].nospec_result) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 824 /* nospec_result is only used to mitigate Spectre v4 and
449f08fa59dda5d Alexei Starovoitov 2026-04-12 825 * to limit verification-time for Spectre v1.
449f08fa59dda5d Alexei Starovoitov 2026-04-12 826 */
449f08fa59dda5d Alexei Starovoitov 2026-04-12 827 struct bpf_insn *patch = insn_buf;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 828
449f08fa59dda5d Alexei Starovoitov 2026-04-12 829 *patch++ = *insn;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 830 *patch++ = BPF_ST_NOSPEC();
449f08fa59dda5d Alexei Starovoitov 2026-04-12 831 cnt = patch - insn_buf;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 832 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 833 if (!new_prog)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 834 return -ENOMEM;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 835
449f08fa59dda5d Alexei Starovoitov 2026-04-12 836 delta += cnt - 1;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 837 env->prog = new_prog;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 838 insn = new_prog->insnsi + i + delta;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 839 continue;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 840 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 841
449f08fa59dda5d Alexei Starovoitov 2026-04-12 842 switch ((int)env->insn_aux_data[i + delta].ptr_type) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 843 case PTR_TO_CTX:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 844 if (!ops->convert_ctx_access)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 845 continue;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 846 convert_ctx_access = ops->convert_ctx_access;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 847 break;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 848 case PTR_TO_SOCKET:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 849 case PTR_TO_SOCK_COMMON:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 850 convert_ctx_access = bpf_sock_convert_ctx_access;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 851 break;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 852 case PTR_TO_TCP_SOCK:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 853 convert_ctx_access = bpf_tcp_sock_convert_ctx_access;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 854 break;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 855 case PTR_TO_XDP_SOCK:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 856 convert_ctx_access = bpf_xdp_sock_convert_ctx_access;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 857 break;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 858 case PTR_TO_BTF_ID:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 859 case PTR_TO_BTF_ID | PTR_UNTRUSTED:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 860 /* PTR_TO_BTF_ID | MEM_ALLOC always has a valid lifetime, unlike
449f08fa59dda5d Alexei Starovoitov 2026-04-12 861 * PTR_TO_BTF_ID, and an active ref_obj_id, but the same cannot
449f08fa59dda5d Alexei Starovoitov 2026-04-12 862 * be said once it is marked PTR_UNTRUSTED, hence we must handle
449f08fa59dda5d Alexei Starovoitov 2026-04-12 863 * any faults for loads into such types. BPF_WRITE is disallowed
449f08fa59dda5d Alexei Starovoitov 2026-04-12 864 * for this case.
449f08fa59dda5d Alexei Starovoitov 2026-04-12 865 */
449f08fa59dda5d Alexei Starovoitov 2026-04-12 866 case PTR_TO_BTF_ID | MEM_ALLOC | PTR_UNTRUSTED:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 867 case PTR_TO_MEM | MEM_RDONLY | PTR_UNTRUSTED:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 868 if (type == BPF_READ) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 869 if (BPF_MODE(insn->code) == BPF_MEM)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 870 insn->code = BPF_LDX | BPF_PROBE_MEM |
449f08fa59dda5d Alexei Starovoitov 2026-04-12 871 BPF_SIZE((insn)->code);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 872 else
449f08fa59dda5d Alexei Starovoitov 2026-04-12 873 insn->code = BPF_LDX | BPF_PROBE_MEMSX |
449f08fa59dda5d Alexei Starovoitov 2026-04-12 874 BPF_SIZE((insn)->code);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 875 env->prog->aux->num_exentries++;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 876 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 877 continue;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 878 case PTR_TO_ARENA:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 879 if (BPF_MODE(insn->code) == BPF_MEMSX) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 880 if (!bpf_jit_supports_insn(insn, true)) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 881 verbose(env, "sign extending loads from arena are not supported yet\n");
449f08fa59dda5d Alexei Starovoitov 2026-04-12 882 return -EOPNOTSUPP;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 883 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 884 insn->code = BPF_CLASS(insn->code) | BPF_PROBE_MEM32SX | BPF_SIZE(insn->code);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 885 } else {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 886 insn->code = BPF_CLASS(insn->code) | BPF_PROBE_MEM32 | BPF_SIZE(insn->code);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 887 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 888 env->prog->aux->num_exentries++;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 889 continue;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 890 default:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 891 continue;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 892 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 893
449f08fa59dda5d Alexei Starovoitov 2026-04-12 894 ctx_field_size = env->insn_aux_data[i + delta].ctx_field_size;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 895 size = BPF_LDST_BYTES(insn);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 896 mode = BPF_MODE(insn->code);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 897
449f08fa59dda5d Alexei Starovoitov 2026-04-12 898 /* If the read access is a narrower load of the field,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 899 * convert to a 4/8-byte load, to minimum program type specific
449f08fa59dda5d Alexei Starovoitov 2026-04-12 900 * convert_ctx_access changes. If conversion is successful,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 901 * we will apply proper mask to the result.
449f08fa59dda5d Alexei Starovoitov 2026-04-12 902 */
449f08fa59dda5d Alexei Starovoitov 2026-04-12 903 is_narrower_load = size < ctx_field_size;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 904 size_default = bpf_ctx_off_adjust_machine(ctx_field_size);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 905 off = insn->off;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 906 if (is_narrower_load) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 907 u8 size_code;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 908
449f08fa59dda5d Alexei Starovoitov 2026-04-12 909 if (type == BPF_WRITE) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 910 verifier_bug(env, "narrow ctx access misconfigured");
449f08fa59dda5d Alexei Starovoitov 2026-04-12 911 return -EFAULT;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 912 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 913
449f08fa59dda5d Alexei Starovoitov 2026-04-12 914 size_code = BPF_H;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 915 if (ctx_field_size == 4)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 916 size_code = BPF_W;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 917 else if (ctx_field_size == 8)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 918 size_code = BPF_DW;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 919
449f08fa59dda5d Alexei Starovoitov 2026-04-12 920 insn->off = off & ~(size_default - 1);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 921 insn->code = BPF_LDX | BPF_MEM | size_code;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 922 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 923
449f08fa59dda5d Alexei Starovoitov 2026-04-12 924 target_size = 0;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 925 cnt = convert_ctx_access(type, insn, insn_buf, env->prog,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 926 &target_size);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 927 if (cnt == 0 || cnt >= INSN_BUF_SIZE ||
449f08fa59dda5d Alexei Starovoitov 2026-04-12 928 (ctx_field_size && !target_size)) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 929 verifier_bug(env, "error during ctx access conversion (%d)", cnt);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 930 return -EFAULT;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 931 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 932
449f08fa59dda5d Alexei Starovoitov 2026-04-12 933 if (is_narrower_load && size < target_size) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 934 u8 shift = bpf_ctx_narrow_access_offset(
449f08fa59dda5d Alexei Starovoitov 2026-04-12 935 off, size, size_default) * 8;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 936 if (shift && cnt + 1 >= INSN_BUF_SIZE) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 937 verifier_bug(env, "narrow ctx load misconfigured");
449f08fa59dda5d Alexei Starovoitov 2026-04-12 938 return -EFAULT;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 939 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 940 if (ctx_field_size <= 4) {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 941 if (shift)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 942 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_RSH,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 943 insn->dst_reg,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 944 shift);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 945 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_AND, insn->dst_reg,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 946 (1 << size * 8) - 1);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 947 } else {
449f08fa59dda5d Alexei Starovoitov 2026-04-12 948 if (shift)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 949 insn_buf[cnt++] = BPF_ALU64_IMM(BPF_RSH,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 950 insn->dst_reg,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 951 shift);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 952 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_AND, insn->dst_reg,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 953 (1ULL << size * 8) - 1);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 954 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 955 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 956 if (mode == BPF_MEMSX)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 957 insn_buf[cnt++] = BPF_RAW_INSN(BPF_ALU64 | BPF_MOV | BPF_X,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 958 insn->dst_reg, insn->dst_reg,
449f08fa59dda5d Alexei Starovoitov 2026-04-12 959 size * 8, 0);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 960
449f08fa59dda5d Alexei Starovoitov 2026-04-12 961 patch_insn_buf:
449f08fa59dda5d Alexei Starovoitov 2026-04-12 962 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
449f08fa59dda5d Alexei Starovoitov 2026-04-12 963 if (!new_prog)
449f08fa59dda5d Alexei Starovoitov 2026-04-12 964 return -ENOMEM;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 965
449f08fa59dda5d Alexei Starovoitov 2026-04-12 966 delta += cnt - 1;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 967
449f08fa59dda5d Alexei Starovoitov 2026-04-12 968 /* keep walking new program and skip insns we just inserted */
449f08fa59dda5d Alexei Starovoitov 2026-04-12 969 env->prog = new_prog;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 970 insn = new_prog->insnsi + i + delta;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 971 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 972
449f08fa59dda5d Alexei Starovoitov 2026-04-12 973 return 0;
449f08fa59dda5d Alexei Starovoitov 2026-04-12 974 }
449f08fa59dda5d Alexei Starovoitov 2026-04-12 975
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-08-13 7:01 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-13 7:01 kernel/bpf/fixups.c:808 bpf_convert_ctx_accesses() error: __builtin_memcpy() 'insn_buf' too small (256 vs u32max) kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2026-04-30 19:24 kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.