crypto: cipher - On clone do crypto_mod_get()
authorDmitry Safonov <dima@arista.com>
Wed, 14 Jun 2023 17:46:43 +0000 (18:46 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 23 Jun 2023 08:15:36 +0000 (16:15 +0800)
The refcounter of underlying algorithm should be incremented, otherwise
it'll be destroyed with the cloned cipher, wrecking the original cipher.

Signed-off-by: Dmitry Safonov <dima@arista.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/cipher.c

index a5a8803..47c77a3 100644 (file)
@@ -101,10 +101,15 @@ struct crypto_cipher *crypto_clone_cipher(struct crypto_cipher *cipher)
        if (alg->cra_init)
                return ERR_PTR(-ENOSYS);
 
+       if (unlikely(!crypto_mod_get(alg)))
+               return ERR_PTR(-ESTALE);
+
        ntfm = __crypto_alloc_tfmgfp(alg, CRYPTO_ALG_TYPE_CIPHER,
                                     CRYPTO_ALG_TYPE_MASK, GFP_ATOMIC);
-       if (IS_ERR(ntfm))
+       if (IS_ERR(ntfm)) {
+               crypto_mod_put(alg);
                return ERR_CAST(ntfm);
+       }
 
        ntfm->crt_flags = tfm->crt_flags;