Skip to content

Commit ab3475d

Browse files
committed
crypto: xts - Handle EBUSY correctly
jira LE-4649 cve CVE-2023-53494 Rebuild_History Non-Buildable kernel-5.14.0-570.60.1.el9_6 commit-author Herbert Xu <herbert@gondor.apana.org.au> commit 51c0825 As it is xts only handles the special return value of EINPROGRESS, which means that in all other cases it will free data related to the request. However, as the caller of xts 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: 8083b1b ("crypto: xts - add support for ciphertext stealing") 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> (cherry picked from commit 51c0825) Signed-off-by: Jonathan Maple <jmaple@ciq.com>
1 parent be74413 commit ab3475d

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

crypto/xts.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,12 +203,12 @@ static void xts_encrypt_done(struct crypto_async_request *areq, int err)
203203
if (!err) {
204204
struct xts_request_ctx *rctx = skcipher_request_ctx(req);
205205

206-
rctx->subreq.base.flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
206+
rctx->subreq.base.flags &= CRYPTO_TFM_REQ_MAY_BACKLOG;
207207
err = xts_xor_tweak_post(req, true);
208208

209209
if (!err && unlikely(req->cryptlen % XTS_BLOCK_SIZE)) {
210210
err = xts_cts_final(req, crypto_skcipher_encrypt);
211-
if (err == -EINPROGRESS)
211+
if (err == -EINPROGRESS || err == -EBUSY)
212212
return;
213213
}
214214
}
@@ -223,12 +223,12 @@ static void xts_decrypt_done(struct crypto_async_request *areq, int err)
223223
if (!err) {
224224
struct xts_request_ctx *rctx = skcipher_request_ctx(req);
225225

226-
rctx->subreq.base.flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
226+
rctx->subreq.base.flags &= CRYPTO_TFM_REQ_MAY_BACKLOG;
227227
err = xts_xor_tweak_post(req, false);
228228

229229
if (!err && unlikely(req->cryptlen % XTS_BLOCK_SIZE)) {
230230
err = xts_cts_final(req, crypto_skcipher_decrypt);
231-
if (err == -EINPROGRESS)
231+
if (err == -EINPROGRESS || err == -EBUSY)
232232
return;
233233
}
234234
}

0 commit comments

Comments
 (0)