crypto: atmel-aes - Reestablish the correct tfm context at dequeue
authorTudor Ambarus <tudor.ambarus@microchip.com>
Wed, 27 Oct 2021 13:30:01 +0000 (16:30 +0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 20 Nov 2021 04:02:07 +0000 (15:02 +1100)
In case there were more requests from different tfms in the crypto
queue, only the context of the last initialized tfm was considered.

Fixes: ec2088b66f7a ("crypto: atmel-aes - Allocate aes dev at tfm init time")
Reported-by: Wolfgang Ocker <weo@reccoware.de>
Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/atmel-aes.c

index 9391ccc..fe05584 100644 (file)
@@ -960,6 +960,7 @@ static int atmel_aes_handle_queue(struct atmel_aes_dev *dd,
        ctx = crypto_tfm_ctx(areq->tfm);
 
        dd->areq = areq;
+       dd->ctx = ctx;
        start_async = (areq != new_areq);
        dd->is_async = start_async;
 
@@ -1274,7 +1275,6 @@ static int atmel_aes_init_tfm(struct crypto_skcipher *tfm)
 
        crypto_skcipher_set_reqsize(tfm, sizeof(struct atmel_aes_reqctx));
        ctx->base.dd = dd;
-       ctx->base.dd->ctx = &ctx->base;
        ctx->base.start = atmel_aes_start;
 
        return 0;
@@ -1291,7 +1291,6 @@ static int atmel_aes_ctr_init_tfm(struct crypto_skcipher *tfm)
 
        crypto_skcipher_set_reqsize(tfm, sizeof(struct atmel_aes_reqctx));
        ctx->base.dd = dd;
-       ctx->base.dd->ctx = &ctx->base;
        ctx->base.start = atmel_aes_ctr_start;
 
        return 0;
@@ -1783,7 +1782,6 @@ static int atmel_aes_gcm_init(struct crypto_aead *tfm)
 
        crypto_aead_set_reqsize(tfm, sizeof(struct atmel_aes_reqctx));
        ctx->base.dd = dd;
-       ctx->base.dd->ctx = &ctx->base;
        ctx->base.start = atmel_aes_gcm_start;
 
        return 0;
@@ -1927,7 +1925,6 @@ static int atmel_aes_xts_init_tfm(struct crypto_skcipher *tfm)
        crypto_skcipher_set_reqsize(tfm, sizeof(struct atmel_aes_reqctx) +
                                    crypto_skcipher_reqsize(ctx->fallback_tfm));
        ctx->base.dd = dd;
-       ctx->base.dd->ctx = &ctx->base;
        ctx->base.start = atmel_aes_xts_start;
 
        return 0;
@@ -2154,7 +2151,6 @@ static int atmel_aes_authenc_init_tfm(struct crypto_aead *tfm,
        crypto_aead_set_reqsize(tfm, (sizeof(struct atmel_aes_authenc_reqctx) +
                                      auth_reqsize));
        ctx->base.dd = dd;
-       ctx->base.dd->ctx = &ctx->base;
        ctx->base.start = atmel_aes_authenc_start;
 
        return 0;