diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2016-08-25 04:49:51 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2016-08-31 10:50:40 -0400 |
commit | 31bd44e7687be8a70e1e744e5cb84974b798d568 (patch) | |
tree | 09a8c2ddfcbd400a1a24772714c047347a1ed899 /crypto | |
parent | 901d3d4fee83e9407d91e7178048e2fed6c91f6b (diff) |
crypto: cryptd - Use correct tfm object for AEAD tracking
The AEAD code path incorrectly uses the child tfm to track the
cryptd refcnt, and then potentially frees the child tfm.
Fixes: 81760ea6a95a ("crypto: cryptd - Add helpers to check...")
Reported-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/cryptd.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/crypto/cryptd.c b/crypto/cryptd.c index cf8037a87b2d..77207b41940c 100644 --- a/crypto/cryptd.c +++ b/crypto/cryptd.c | |||
@@ -733,13 +733,14 @@ static void cryptd_aead_crypt(struct aead_request *req, | |||
733 | rctx = aead_request_ctx(req); | 733 | rctx = aead_request_ctx(req); |
734 | compl = rctx->complete; | 734 | compl = rctx->complete; |
735 | 735 | ||
736 | tfm = crypto_aead_reqtfm(req); | ||
737 | |||
736 | if (unlikely(err == -EINPROGRESS)) | 738 | if (unlikely(err == -EINPROGRESS)) |
737 | goto out; | 739 | goto out; |
738 | aead_request_set_tfm(req, child); | 740 | aead_request_set_tfm(req, child); |
739 | err = crypt( req ); | 741 | err = crypt( req ); |
740 | 742 | ||
741 | out: | 743 | out: |
742 | tfm = crypto_aead_reqtfm(req); | ||
743 | ctx = crypto_aead_ctx(tfm); | 744 | ctx = crypto_aead_ctx(tfm); |
744 | refcnt = atomic_read(&ctx->refcnt); | 745 | refcnt = atomic_read(&ctx->refcnt); |
745 | 746 | ||