From: Hangbin Liu <hidden> Date: 2021-06-03 05:53:52
In curve25519_mod_init() the curve25519_alg will be registered only when
(X86_FEATURE_BMI2 && X86_FEATURE_ADX). But in curve25519_mod_exit()
it still checks (X86_FEATURE_BMI2 || X86_FEATURE_ADX) when do crypto
unregister. This will trigger a BUG_ON in crypto_unregister_alg() as
alg->cra_refcnt is 0 if the cpu only supports one of X86_FEATURE_BMI2
and X86_FEATURE_ADX.
Fixes: 07b586fe0662 ("crypto: x86/curve25519 - replace with formally verified implementation")
Signed-off-by: Hangbin Liu <redacted>
---
arch/x86/crypto/curve25519-x86_64.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: "Jason A. Donenfeld" <Jason@zx2c4.com> Date: 2021-06-03 10:31:07
On Thu, Jun 3, 2021 at 7:53 AM Hangbin Liu [off-list ref] wrote:
quoted hunk
In curve25519_mod_init() the curve25519_alg will be registered only when
(X86_FEATURE_BMI2 && X86_FEATURE_ADX). But in curve25519_mod_exit()
it still checks (X86_FEATURE_BMI2 || X86_FEATURE_ADX) when do crypto
unregister. This will trigger a BUG_ON in crypto_unregister_alg() as
alg->cra_refcnt is 0 if the cpu only supports one of X86_FEATURE_BMI2
and X86_FEATURE_ADX.
Fixes: 07b586fe0662 ("crypto: x86/curve25519 - replace with formally verified implementation")
Signed-off-by: Hangbin Liu <redacted>
---
arch/x86/crypto/curve25519-x86_64.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -1500,7 +1500,7 @@ static int __init curve25519_mod_init(void)staticvoid__exitcurve25519_mod_exit(void){if(IS_REACHABLE(CONFIG_CRYPTO_KPP)&&-(boot_cpu_has(X86_FEATURE_BMI2)||boot_cpu_has(X86_FEATURE_ADX)))+static_branch_likely(&curve25519_use_bmi2_adx))crypto_unregister_kpp(&curve25519_alg);}
Looks like the error is actually that the `||` should be a `&&`. But
if you'd like to branch on that static key instead, that's fine.
Cc: stable@vger.kernel.org
Reviewed-by: Jason A. Donenfeld <Jason@zx2c4.com>
From: Herbert Xu <herbert@gondor.apana.org.au> Date: 2021-06-11 07:23:16
On Thu, Jun 03, 2021 at 01:53:40AM -0400, Hangbin Liu wrote:
In curve25519_mod_init() the curve25519_alg will be registered only when
(X86_FEATURE_BMI2 && X86_FEATURE_ADX). But in curve25519_mod_exit()
it still checks (X86_FEATURE_BMI2 || X86_FEATURE_ADX) when do crypto
unregister. This will trigger a BUG_ON in crypto_unregister_alg() as
alg->cra_refcnt is 0 if the cpu only supports one of X86_FEATURE_BMI2
and X86_FEATURE_ADX.
Fixes: 07b586fe0662 ("crypto: x86/curve25519 - replace with formally verified implementation")
Signed-off-by: Hangbin Liu <redacted>
---
arch/x86/crypto/curve25519-x86_64.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)