From 67d17dd590f913643f5adc8aced369221faccf05 Mon Sep 17 00:00:00 2001 From: Mr NeilBrown Date: Wed, 9 Dec 2020 12:49:13 +1100 Subject: [PATCH] LU-14195 libcfs: switch to kfree_sensitive In Linux 5.10, kzfree() has been renamed kfree_sensitive(). So switch to the new name and provide back-compat support for older kernels. Test-Parameters: trivial Signed-off-by: Mr NeilBrown Change-Id: If665168477a0b6241a8ddf31a111cd465fe97783 Reviewed-on: https://review.whamcloud.com/40908 Tested-by: jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Petros Koutoupis Reviewed-by: Oleg Drokin --- libcfs/autoconf/lustre-libcfs.m4 | 22 ++++++++++++++++++++++ libcfs/include/libcfs/linux/linux-mem.h | 4 ++++ libcfs/libcfs/crypto/keyring.c | 2 +- libcfs/libcfs/crypto/keysetup_v1.c | 4 ++-- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/libcfs/autoconf/lustre-libcfs.m4 b/libcfs/autoconf/lustre-libcfs.m4 index d3dcc6c..a4abdd2 100644 --- a/libcfs/autoconf/lustre-libcfs.m4 +++ b/libcfs/autoconf/lustre-libcfs.m4 @@ -1378,6 +1378,26 @@ kernel_setsockopt_exists, [ EXTRA_KCFLAGS="$tmp_flags" ]) # LIBCFS_KERNEL_SETSOCKOPT +# +# LIBCFS_HAVE_KFREE_SENSITIVE +# +# kernel v5.10-rc1~3 +# mm: remove kzfree() compatibility definition +# +AC_DEFUN([LIBCFS_HAVE_KFREE_SENSITIVE], [ +LB_CHECK_COMPILE([if kfree_sensitive() is available], +kfree_sensitive_exists, [ + #include + +],[ + kfree_sensitive(NULL); +],[ + AC_DEFINE(HAVE_KFREE_SENSITIVE, 1, + [kfree_sensitive() is available.]) +]) +EXTRA_KCFLAGS="$tmp_flags" +]) # LIBCFS_HAVE_NR_UNSTABLE_NFS + AC_DEFUN([LIBCFS_PROG_LINUX_SRC], [] ) AC_DEFUN([LIBCFS_PROG_LINUX_RESULTS], []) @@ -1492,6 +1512,8 @@ LIBCFS_KALLSYMS_LOOKUP LIBCFS_HAVE_MMAP_LOCK LIBCFS_KERNEL_SETSOCKOPT LIBCFS_VMALLOC_2ARGS +# 5.10 +LIBCFS_HAVE_KFREE_SENSITIVE ]) # LIBCFS_PROG_LINUX # diff --git a/libcfs/include/libcfs/linux/linux-mem.h b/libcfs/include/libcfs/linux/linux-mem.h index 69d027f..52b25b9 100644 --- a/libcfs/include/libcfs/linux/linux-mem.h +++ b/libcfs/include/libcfs/linux/linux-mem.h @@ -137,4 +137,8 @@ static inline void mmap_read_unlock(struct mm_struct *mm) #define __ll_vmalloc(size, flags) __vmalloc(size, flags, PAGE_KERNEL) #endif +#ifndef HAVE_KFREE_SENSITIVE +#define kfree_sensitive(x) kzfree(x) +#endif + #endif /* __LINUX_CFS_MEM_H__ */ diff --git a/libcfs/libcfs/crypto/keyring.c b/libcfs/libcfs/crypto/keyring.c index 6b9f693..358dda2 100644 --- a/libcfs/libcfs/crypto/keyring.c +++ b/libcfs/libcfs/crypto/keyring.c @@ -52,7 +52,7 @@ static void free_master_key(struct llcrypt_master_key *mk) crypto_free_skcipher(mk->mk_mode_keys[i]); key_put(mk->mk_users); - kzfree(mk); + kfree_sensitive(mk); } static inline bool valid_key_spec(const struct llcrypt_key_specifier *spec) diff --git a/libcfs/libcfs/crypto/keysetup_v1.c b/libcfs/libcfs/crypto/keysetup_v1.c index d26735e..e56bce3 100644 --- a/libcfs/libcfs/crypto/keysetup_v1.c +++ b/libcfs/libcfs/crypto/keysetup_v1.c @@ -159,7 +159,7 @@ static void free_direct_key(struct llcrypt_direct_key *dk) { if (dk) { crypto_free_skcipher(dk->dk_ctfm); - kzfree(dk); + kfree_sensitive(dk); } } @@ -308,7 +308,7 @@ static int setup_v1_file_key_derived(struct llcrypt_info *ci, err = llcrypt_set_derived_key(ci, derived_key); out: - kzfree(derived_key); + kfree_sensitive(derived_key); return err; } -- 1.8.3.1