Forum | Documentation | Website | Blog

Skip to content
Snippets Groups Projects
Commit b5a772ad authored by Herbert Xu's avatar Herbert Xu
Browse files

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: be1eb7f7

 ("crypto: essiv - create wrapper template...")
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Acked-by: default avatarArd Biesheuvel <ardb@kernel.org>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent b0f4f746
No related merge requests found
...@@ -171,7 +171,12 @@ static void essiv_aead_done(struct crypto_async_request *areq, int err) ...@@ -171,7 +171,12 @@ static void essiv_aead_done(struct crypto_async_request *areq, int err)
struct aead_request *req = areq->data; struct aead_request *req = areq->data;
struct essiv_aead_request_ctx *rctx = aead_request_ctx(req); struct essiv_aead_request_ctx *rctx = aead_request_ctx(req);
if (err == -EINPROGRESS)
goto out;
kfree(rctx->assoc); kfree(rctx->assoc);
out:
aead_request_complete(req, err); aead_request_complete(req, err);
} }
...@@ -247,7 +252,7 @@ static int essiv_aead_crypt(struct aead_request *req, bool enc) ...@@ -247,7 +252,7 @@ static int essiv_aead_crypt(struct aead_request *req, bool enc)
err = enc ? crypto_aead_encrypt(subreq) : err = enc ? crypto_aead_encrypt(subreq) :
crypto_aead_decrypt(subreq); crypto_aead_decrypt(subreq);
if (rctx->assoc && err != -EINPROGRESS) if (rctx->assoc && err != -EINPROGRESS && err != -EBUSY)
kfree(rctx->assoc); kfree(rctx->assoc);
return err; return err;
} }
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment