2023-03-13 09:18:24

by Toke Høiland-Jørgensen

[permalink] [raw]
Subject: [PATCH v2] crypto: Demote BUG_ON() in crypto_unregister_alg() to a WARN_ON()

The crypto_unregister_alg() function expects callers to ensure that any
algorithm that is unregistered has a refcnt of exactly 1, and issues a
BUG_ON() if this is not the case. However, there are in fact drivers that
will call crypto_unregister_alg() without ensuring that the refcnt has been
lowered first, most notably on system shutdown. This causes the BUG_ON() to
trigger, which prevents a clean shutdown and hangs the system.

To avoid such hangs on shutdown, demote the BUG_ON() in
crypto_unregister_alg() to a WARN_ON() with early return. Cc stable because
this problem was observed on a 6.2 kernel, cf the link below.

Link: https://lore.kernel.org/r/[email protected]
Cc: [email protected]
Signed-off-by: Toke Høiland-Jørgensen <[email protected]>
---
v2:
- Return early if the WARN_ON() triggers

crypto/algapi.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/crypto/algapi.c b/crypto/algapi.c
index d08f864f08be..9de0677b3643 100644
--- a/crypto/algapi.c
+++ b/crypto/algapi.c
@@ -493,7 +493,9 @@ void crypto_unregister_alg(struct crypto_alg *alg)
if (WARN(ret, "Algorithm %s is not registered", alg->cra_driver_name))
return;

- BUG_ON(refcount_read(&alg->cra_refcnt) != 1);
+ if (WARN_ON(refcount_read(&alg->cra_refcnt) != 1))
+ return;
+
if (alg->cra_destroy)
alg->cra_destroy(alg);

--
2.39.2



2023-03-24 10:30:47

by Herbert Xu

[permalink] [raw]
Subject: Re: [PATCH v2] crypto: Demote BUG_ON() in crypto_unregister_alg() to a WARN_ON()

On Mon, Mar 13, 2023 at 10:17:24AM +0100, Toke H?iland-J?rgensen wrote:
> The crypto_unregister_alg() function expects callers to ensure that any
> algorithm that is unregistered has a refcnt of exactly 1, and issues a
> BUG_ON() if this is not the case. However, there are in fact drivers that
> will call crypto_unregister_alg() without ensuring that the refcnt has been
> lowered first, most notably on system shutdown. This causes the BUG_ON() to
> trigger, which prevents a clean shutdown and hangs the system.
>
> To avoid such hangs on shutdown, demote the BUG_ON() in
> crypto_unregister_alg() to a WARN_ON() with early return. Cc stable because
> this problem was observed on a 6.2 kernel, cf the link below.
>
> Link: https://lore.kernel.org/r/[email protected]
> Cc: [email protected]
> Signed-off-by: Toke H?iland-J?rgensen <[email protected]>
> ---
> v2:
> - Return early if the WARN_ON() triggers
>
> crypto/algapi.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)

Patch applied. Thanks.
--
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt