Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

bpf: Add __force annotations to silence sparse warnings

Add __force annotations to casts that convert between __user and kernel
address spaces. These casts are intentional:

- In bpf_send_signal_common(), the value is stored in si_value.sival_ptr
which is typed as void __user *, but the value comes from a BPF
program parameter.

- In the bpf_*_dynptr() kfuncs, user pointers are cast to const void *
before being passed to copy helper functions that correctly handle
the user address space through copy_from_user variants.

Without __force, sparse reports:
warning: cast removes address space '__user' of expression

Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20260115184509.3585759-1-mykyta.yatsenko5@gmail.com

Closes: https://lore.kernel.org/oe-kbuild-all/202601131740.6C3BdBaB-lkp@intel.com/

authored by

Mykyta Yatsenko and committed by
Andrii Nakryiko
17001476 2acbd053

+7 -7
+7 -7
kernel/trace/bpf_trace.c
··· 830 830 info.si_code = SI_KERNEL; 831 831 info.si_pid = 0; 832 832 info.si_uid = 0; 833 - info.si_value.sival_ptr = (void *)(unsigned long)value; 833 + info.si_value.sival_ptr = (void __user __force *)(unsigned long)value; 834 834 siginfo = &info; 835 835 } 836 836 ··· 3518 3518 __bpf_kfunc int bpf_probe_read_user_dynptr(struct bpf_dynptr *dptr, u64 off, 3519 3519 u64 size, const void __user *unsafe_ptr__ign) 3520 3520 { 3521 - return __bpf_dynptr_copy(dptr, off, size, (const void *)unsafe_ptr__ign, 3521 + return __bpf_dynptr_copy(dptr, off, size, (const void __force *)unsafe_ptr__ign, 3522 3522 copy_user_data_nofault, NULL); 3523 3523 } 3524 3524 ··· 3532 3532 __bpf_kfunc int bpf_probe_read_user_str_dynptr(struct bpf_dynptr *dptr, u64 off, 3533 3533 u64 size, const void __user *unsafe_ptr__ign) 3534 3534 { 3535 - return __bpf_dynptr_copy_str(dptr, off, size, (const void *)unsafe_ptr__ign, 3535 + return __bpf_dynptr_copy_str(dptr, off, size, (const void __force *)unsafe_ptr__ign, 3536 3536 copy_user_str_nofault, NULL); 3537 3537 } 3538 3538 ··· 3546 3546 __bpf_kfunc int bpf_copy_from_user_dynptr(struct bpf_dynptr *dptr, u64 off, 3547 3547 u64 size, const void __user *unsafe_ptr__ign) 3548 3548 { 3549 - return __bpf_dynptr_copy(dptr, off, size, (const void *)unsafe_ptr__ign, 3549 + return __bpf_dynptr_copy(dptr, off, size, (const void __force *)unsafe_ptr__ign, 3550 3550 copy_user_data_sleepable, NULL); 3551 3551 } 3552 3552 3553 3553 __bpf_kfunc int bpf_copy_from_user_str_dynptr(struct bpf_dynptr *dptr, u64 off, 3554 3554 u64 size, const void __user *unsafe_ptr__ign) 3555 3555 { 3556 - return __bpf_dynptr_copy_str(dptr, off, size, (const void *)unsafe_ptr__ign, 3556 + return __bpf_dynptr_copy_str(dptr, off, size, (const void __force *)unsafe_ptr__ign, 3557 3557 copy_user_str_sleepable, NULL); 3558 3558 } 3559 3559 ··· 3561 3561 u64 size, const void __user *unsafe_ptr__ign, 3562 3562 struct task_struct *tsk) 3563 3563 { 3564 - return __bpf_dynptr_copy(dptr, off, size, (const void *)unsafe_ptr__ign, 3564 + return __bpf_dynptr_copy(dptr, off, size, (const void __force *)unsafe_ptr__ign, 3565 3565 copy_user_data_sleepable, tsk); 3566 3566 } 3567 3567 ··· 3569 3569 u64 size, const void __user *unsafe_ptr__ign, 3570 3570 struct task_struct *tsk) 3571 3571 { 3572 - return __bpf_dynptr_copy_str(dptr, off, size, (const void *)unsafe_ptr__ign, 3572 + return __bpf_dynptr_copy_str(dptr, off, size, (const void __force *)unsafe_ptr__ign, 3573 3573 copy_user_str_sleepable, tsk); 3574 3574 } 3575 3575