| From 29009604ad4e3ef784fd9b9fef6f23610ddf633d Mon Sep 17 00:00:00 2001 |
| From: Marek Vasut <marex@denx.de> |
| Date: Mon, 20 Dec 2021 20:50:22 +0100 |
| Subject: crypto: stm32/crc32 - Fix kernel BUG triggered in probe() |
| |
| From: Marek Vasut <marex@denx.de> |
| |
| commit 29009604ad4e3ef784fd9b9fef6f23610ddf633d upstream. |
| |
| The include/linux/crypto.h struct crypto_alg field cra_driver_name description |
| states "Unique name of the transformation provider. " ... " this contains the |
| name of the chip or provider and the name of the transformation algorithm." |
| |
| In case of the stm32-crc driver, field cra_driver_name is identical for all |
| registered transformation providers and set to the name of the driver itself, |
| which is incorrect. This patch fixes it by assigning a unique cra_driver_name |
| to each registered transformation provider. |
| |
| The kernel crash is triggered when the driver calls crypto_register_shashes() |
| which calls crypto_register_shash(), which calls crypto_register_alg(), which |
| calls __crypto_register_alg(), which returns -EEXIST, which is propagated |
| back through this call chain. Upon -EEXIST from crypto_register_shash(), the |
| crypto_register_shashes() starts unregistering the providers back, and calls |
| crypto_unregister_shash(), which calls crypto_unregister_alg(), and this is |
| where the BUG() triggers due to incorrect cra_refcnt. |
| |
| Fixes: b51dbe90912a ("crypto: stm32 - Support for STM32 CRC32 crypto module") |
| Signed-off-by: Marek Vasut <marex@denx.de> |
| Cc: <stable@vger.kernel.org> # 4.12+ |
| Cc: Alexandre Torgue <alexandre.torgue@foss.st.com> |
| Cc: Fabien Dessenne <fabien.dessenne@st.com> |
| Cc: Herbert Xu <herbert@gondor.apana.org.au> |
| Cc: Lionel Debieve <lionel.debieve@st.com> |
| Cc: Nicolas Toromanoff <nicolas.toromanoff@st.com> |
| Cc: linux-arm-kernel@lists.infradead.org |
| Cc: linux-stm32@st-md-mailman.stormreply.com |
| To: linux-crypto@vger.kernel.org |
| Acked-by: Nicolas Toromanoff <nicolas.toromanoff@foss.st.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/crypto/stm32/stm32-crc32.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/crypto/stm32/stm32-crc32.c |
| +++ b/drivers/crypto/stm32/stm32-crc32.c |
| @@ -279,7 +279,7 @@ static struct shash_alg algs[] = { |
| .digestsize = CHKSUM_DIGEST_SIZE, |
| .base = { |
| .cra_name = "crc32", |
| - .cra_driver_name = DRIVER_NAME, |
| + .cra_driver_name = "stm32-crc32-crc32", |
| .cra_priority = 200, |
| .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, |
| .cra_blocksize = CHKSUM_BLOCK_SIZE, |
| @@ -301,7 +301,7 @@ static struct shash_alg algs[] = { |
| .digestsize = CHKSUM_DIGEST_SIZE, |
| .base = { |
| .cra_name = "crc32c", |
| - .cra_driver_name = DRIVER_NAME, |
| + .cra_driver_name = "stm32-crc32-crc32c", |
| .cra_priority = 200, |
| .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, |
| .cra_blocksize = CHKSUM_BLOCK_SIZE, |