Skip to content

Commit 0fda923

Browse files
crypto: xts - Handle EBUSY correctly
jira VULN-157046 cve CVE-2023-53494 commit-author Herbert Xu <[email protected]> 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 <[email protected]> Acked-by: Ard Biesheuvel <[email protected]> Signed-off-by: Herbert Xu <[email protected]> (cherry picked from commit 51c0825) Signed-off-by: Shreeya Patel <[email protected]>
1 parent b189105 commit 0fda923

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)