Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c61e7d18 authored by Herbert Xu's avatar Herbert Xu Committed by Greg Kroah-Hartman
Browse files

crypto: essiv - Handle EBUSY correctly



[ Upstream commit b5a772adf45a32c68bef28e60621f12617161556 ]

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>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent bfef5e3e
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -188,7 +188,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);
}

@@ -264,7 +269,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;
}