]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
tls: wait for pending async decryptions if tls_strp_msg_hold fails
authorSabrina Dubroca <sd@queasysnail.net>
Tue, 14 Oct 2025 09:16:59 +0000 (11:16 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 Oct 2025 14:24:31 +0000 (16:24 +0200)
[ Upstream commit b8a6ff84abbcbbc445463de58704686011edc8e1 ]

Async decryption calls tls_strp_msg_hold to create a clone of the
input skb to hold references to the memory it uses. If we fail to
allocate that clone, proceeding with async decryption can lead to
various issues (UAF on the skb, writing into userspace memory after
the recv() call has returned).

In this case, wait for all pending decryption requests.

Fixes: 84c61fe1a75b ("tls: rx: do not use the standard strparser")
Reported-by: Jann Horn <jannh@google.com>
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Link: https://patch.msgid.link/b9fe61dcc07dab15da9b35cf4c7d86382a98caf2.1760432043.git.sd@queasysnail.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/tls/tls_sw.c

index 1478d515badc83d67e8496cec6323d8d23eb8c59..e3d852091e7a43dbbf6ad7bc779c77e82c5dc34d 100644 (file)
@@ -1641,8 +1641,10 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,
 
        if (unlikely(darg->async)) {
                err = tls_strp_msg_hold(&ctx->strp, &ctx->async_hold);
-               if (err)
-                       __skb_queue_tail(&ctx->async_hold, darg->skb);
+               if (err) {
+                       err = tls_decrypt_async_wait(ctx);
+                       darg->async = false;
+               }
                return err;
        }