]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
tls: wait for async encrypt in case of error during latter iterations of sendmsg
authorSabrina Dubroca <sd@queasysnail.net>
Tue, 14 Oct 2025 09:16:57 +0000 (11:16 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Oct 2025 13:03:08 +0000 (14:03 +0100)
[ Upstream commit b014a4e066c555185b7c367efacdc33f16695495 ]

If we hit an error during the main loop of tls_sw_sendmsg_locked (eg
failed allocation), we jump to send_end and immediately
return. Previous iterations may have queued async encryption requests
that are still pending. We should wait for those before returning, as
we could otherwise be reading from memory that userspace believes
we're not using anymore, which would be a sort of use-after-free.

This is similar to what tls_sw_recvmsg already does: failures during
the main loop jump to the "wait for async" code, not straight to the
unlock/return.

Fixes: a42055e8d2c3 ("net/tls: Add support for async encryption of records for performance")
Reported-by: Jann Horn <jannh@google.com>
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Link: https://patch.msgid.link/c793efe9673b87f808d84fdefc0f732217030c52.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 d2cb19f5cb8bcbeb031409befa8f2c5fca951987..e08edfc639fd53629621e9b1d5d3b1f8e34a61df 100644 (file)
@@ -1013,7 +1013,7 @@ int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
                        if (ret == -EINPROGRESS)
                                num_async++;
                        else if (ret != -EAGAIN)
-                               goto send_end;
+                               goto end;
                }
        }
 
@@ -1162,8 +1162,9 @@ trim_sgl:
                        goto alloc_encrypted;
        }
 
+send_end:
        if (!num_async) {
-               goto send_end;
+               goto end;
        } else if (num_zc || eor) {
                int err;
 
@@ -1181,7 +1182,7 @@ trim_sgl:
                tls_tx_records(sk, msg->msg_flags);
        }
 
-send_end:
+end:
        ret = sk_stream_error(sk, msg->msg_flags, ret);
 
        release_sock(sk);