mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-23 07:23:12 +02:00
tls: separate no-async decryption request handling from async
commit41532b785e
upstream. If we're not doing async, the handling is much simpler. There's no reference counting, we just need to wait for the completion to wake us up and return its result. We should preferably also use a separate crypto_wait. I'm not seeing a UAF as I did in the past, I thinkaec7961916
("tls: fix race between async notify and socket close") took care of it. This will make the next fix easier. Signed-off-by: Sabrina Dubroca <sd@queasysnail.net> Link: https://lore.kernel.org/r/47bde5f649707610eaef9f0d679519966fc31061.1709132643.git.sd@queasysnail.net Signed-off-by: Jakub Kicinski <kuba@kernel.org> [ William: The original patch did not apply cleanly due to deletions of non-existent lines in 6.1.y. The UAF the author stopped seeing can still be reproduced on systems without AVX in conjunction with cryptd. Also removed an extraneous statement after a return statement that is adjacent to diff. ] Link: https://lore.kernel.org/netdev/he2K1yz_u7bZ-CnYcTSQ4OxuLuHZXN6xZRgp6_ICSWnq8J5FpI_uD1i_1lTSf7WMrYb5ThiX1OR2GTOB2IltgT49Koy7Hhutr4du4KtLvyk=@willsroot.io/ Signed-off-by: William Liu <will@willsroot.io> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
74c68b295b
commit
48905146d1
|
@ -274,9 +274,15 @@ static int tls_do_decryption(struct sock *sk,
|
||||||
DEBUG_NET_WARN_ON_ONCE(atomic_read(&ctx->decrypt_pending) < 1);
|
DEBUG_NET_WARN_ON_ONCE(atomic_read(&ctx->decrypt_pending) < 1);
|
||||||
atomic_inc(&ctx->decrypt_pending);
|
atomic_inc(&ctx->decrypt_pending);
|
||||||
} else {
|
} else {
|
||||||
|
DECLARE_CRYPTO_WAIT(wait);
|
||||||
|
|
||||||
aead_request_set_callback(aead_req,
|
aead_request_set_callback(aead_req,
|
||||||
CRYPTO_TFM_REQ_MAY_BACKLOG,
|
CRYPTO_TFM_REQ_MAY_BACKLOG,
|
||||||
crypto_req_done, &ctx->async_wait);
|
crypto_req_done, &wait);
|
||||||
|
ret = crypto_aead_decrypt(aead_req);
|
||||||
|
if (ret == -EINPROGRESS || ret == -EBUSY)
|
||||||
|
ret = crypto_wait_req(ret, &wait);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = crypto_aead_decrypt(aead_req);
|
ret = crypto_aead_decrypt(aead_req);
|
||||||
|
@ -289,7 +295,6 @@ static int tls_do_decryption(struct sock *sk,
|
||||||
/* all completions have run, we're not doing async anymore */
|
/* all completions have run, we're not doing async anymore */
|
||||||
darg->async = false;
|
darg->async = false;
|
||||||
return ret;
|
return ret;
|
||||||
ret = ret ?: -EINPROGRESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_dec(&ctx->decrypt_pending);
|
atomic_dec(&ctx->decrypt_pending);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user