With CONFIG_CFI_CLANG enabled, the kernel strictly enforces that
indirect function calls use a function pointer type that matches the
target function. I ran into the following type mismatch when running
BPF self-tests:
CFI failure at bpf_obj_free_fields+0x190/0x238 (target:
bpf_crypto_ctx_release+0x0/0x94; expected type: 0xa488ebfc)
Internal error: Oops - CFI: 00000000f2008228 [#1] SMP
...
As bpf_crypto_ctx_release() is also used in BPF programs and using
a void pointer as the argument would make the verifier unhappy, add
a simple stub function with the correct type and register it as the
destructor kfunc instead.
Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
---
kernel/bpf/crypto.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/kernel/bpf/crypto.c b/kernel/bpf/crypto.c
index 94854cd9c4cc..a267d9087d40 100644
--- a/kernel/bpf/crypto.c
+++ b/kernel/bpf/crypto.c
@@ -261,6 +261,12 @@ __bpf_kfunc void bpf_crypto_ctx_release(struct bpf_crypto_ctx *ctx)
call_rcu(&ctx->rcu, crypto_free_cb);
}
+__bpf_kfunc void bpf_crypto_ctx_release_dtor(void *ctx)
+{
+ bpf_crypto_ctx_release(ctx);
+}
+CFI_NOSEAL(bpf_crypto_ctx_release_dtor);
+
static int bpf_crypto_crypt(const struct bpf_crypto_ctx *ctx,
const struct bpf_dynptr_kern *src,
const struct bpf_dynptr_kern *dst,
@@ -368,7 +374,7 @@ static const struct btf_kfunc_id_set crypt_kfunc_set = {
BTF_ID_LIST(bpf_crypto_dtor_ids)
BTF_ID(struct, bpf_crypto_ctx)
-BTF_ID(func, bpf_crypto_ctx_release)
+BTF_ID(func, bpf_crypto_ctx_release_dtor)
static int __init crypto_kfunc_init(void)
{
--
2.50.1.552.g942d659e1b-goog
Hi Sami, kernel test robot noticed the following build warnings: [auto build test WARNING on 5b4c54ac49af7f486806d79e3233fc8a9363961c] url: https://github.com/intel-lab-lkp/linux/commits/Sami-Tolvanen/bpf-crypto-Use-the-correct-destructor-kfunc-type/20250729-042936 base: 5b4c54ac49af7f486806d79e3233fc8a9363961c patch link: https://lore.kernel.org/r/20250728202656.559071-7-samitolvanen%40google.com patch subject: [PATCH bpf-next v3 1/4] bpf: crypto: Use the correct destructor kfunc type config: alpha-randconfig-r111-20250729 (https://download.01.org/0day-ci/archive/20250730/202507300122.RpqIKqFR-lkp@intel.com/config) compiler: alpha-linux-gcc (GCC) 8.5.0 reproduce: (https://download.01.org/0day-ci/archive/20250730/202507300122.RpqIKqFR-lkp@intel.com/reproduce) 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 | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202507300122.RpqIKqFR-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) >> kernel/bpf/crypto.c:264:18: sparse: sparse: symbol 'bpf_crypto_ctx_release_dtor' was not declared. Should it be static? vim +/bpf_crypto_ctx_release_dtor +264 kernel/bpf/crypto.c 263 > 264 __bpf_kfunc void bpf_crypto_ctx_release_dtor(void *ctx) 265 { 266 bpf_crypto_ctx_release(ctx); 267 } 268 CFI_NOSEAL(bpf_crypto_ctx_release_dtor); 269 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
On Tue, Jul 29, 2025 at 10:54 AM kernel test robot <lkp@intel.com> wrote: > > Hi Sami, > > kernel test robot noticed the following build warnings: > > [auto build test WARNING on 5b4c54ac49af7f486806d79e3233fc8a9363961c] > > url: https://github.com/intel-lab-lkp/linux/commits/Sami-Tolvanen/bpf-crypto-Use-the-correct-destructor-kfunc-type/20250729-042936 > base: 5b4c54ac49af7f486806d79e3233fc8a9363961c > patch link: https://lore.kernel.org/r/20250728202656.559071-7-samitolvanen%40google.com > patch subject: [PATCH bpf-next v3 1/4] bpf: crypto: Use the correct destructor kfunc type > config: alpha-randconfig-r111-20250729 (https://download.01.org/0day-ci/archive/20250730/202507300122.RpqIKqFR-lkp@intel.com/config) > compiler: alpha-linux-gcc (GCC) 8.5.0 > reproduce: (https://download.01.org/0day-ci/archive/20250730/202507300122.RpqIKqFR-lkp@intel.com/reproduce) > > 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 > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202507300122.RpqIKqFR-lkp@intel.com/ > > sparse warnings: (new ones prefixed by >>) > >> kernel/bpf/crypto.c:264:18: sparse: sparse: symbol 'bpf_crypto_ctx_release_dtor' was not declared. Should it be static? > > vim +/bpf_crypto_ctx_release_dtor +264 kernel/bpf/crypto.c > > 263 > > 264 __bpf_kfunc void bpf_crypto_ctx_release_dtor(void *ctx) > 265 { > 266 bpf_crypto_ctx_release(ctx); > 267 } > 268 CFI_NOSEAL(bpf_crypto_ctx_release_dtor); > 269 __bpf_kfunc_start_defs() disables -Wmissing-declarations here, but I assume sparse doesn't care about that. Is there something we can do to teach it about this? Sami
On 7/28/25 1:26 PM, Sami Tolvanen wrote: > With CONFIG_CFI_CLANG enabled, the kernel strictly enforces that > indirect function calls use a function pointer type that matches the > target function. I ran into the following type mismatch when running > BPF self-tests: > > CFI failure at bpf_obj_free_fields+0x190/0x238 (target: > bpf_crypto_ctx_release+0x0/0x94; expected type: 0xa488ebfc) > Internal error: Oops - CFI: 00000000f2008228 [#1] SMP > ... > > As bpf_crypto_ctx_release() is also used in BPF programs and using > a void pointer as the argument would make the verifier unhappy, add > a simple stub function with the correct type and register it as the > destructor kfunc instead. > > Signed-off-by: Sami Tolvanen <samitolvanen@google.com> Acked-by: Yonghong Song <yonghong.song@linux.dev>
© 2016 - 2025 Red Hat, Inc.