crypto: essiv - Handle EBUSY correctly
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 13 Jan 2023 10:24:09 +0000 (18:24 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 20 Jan 2023 10:29:31 +0000 (18:29 +0800)
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: be1eb7f78aa8 ("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>
crypto/essiv.c

index e33369df90344545b9bffd8bfda2697190441a5a..307eba74b901e595ddb1a86e348e965f68d87f51 100644 (file)
@@ -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;
 }