summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2023-01-13 18:24:09 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2023-01-20 18:29:31 +0800
commit3f8703f5d07212871effa9b09eb6385fe410a0d0 (patch)
tree3c15c587b0772a879ab8c031cad91d1af626e1b1
parent08ba73b8cc9000f7c43af2645ef02299f7b3d9d0 (diff)
downloadlinux-crypto-3f8703f5d07212871effa9b09eb6385fe410a0d0.tar.gz
linux-crypto-3f8703f5d07212871effa9b09eb6385fe410a0d0.zip
crypto: essiv - Handle EBUSY correctly
As it is essiv only handles the special return value of EINPROGERSS, which means that in all other cases it will free data related to the request. However, as the caller of essiv may specify MAY_BACKLOG, we also need to expect EBUSY and treat it in the same way. Otherwise backlogged requests will trigger a use-after-free. Fixes: 392e2e025cfd ("crypto: essiv - create wrapper template...") Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Acked-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--crypto/essiv.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/crypto/essiv.c b/crypto/essiv.c
index e33369df..307eba74 100644
--- a/crypto/essiv.c
+++ b/crypto/essiv.c
@@ -171,7 +171,12 @@ static void essiv_aead_done(struct crypto_async_request *areq, int err)
struct aead_request *req = areq->data;
struct essiv_aead_request_ctx *rctx = aead_request_ctx(req);
+ if (err == -EINPROGRESS)
+ goto out;
+
kfree(rctx->assoc);
+
+out:
aead_request_complete(req, err);
}
@@ -247,7 +252,7 @@ static int essiv_aead_crypt(struct aead_request *req, bool enc)
err = enc ? crypto_aead_encrypt(subreq) :
crypto_aead_decrypt(subreq);
- if (rctx->assoc && err != -EINPROGRESS)
+ if (rctx->assoc && err != -EINPROGRESS && err != -EBUSY)
kfree(rctx->assoc);
return err;
}