]> www.infradead.org Git - users/hch/misc.git/commitdiff
tls: always set record_type in tls_process_cmsg
authorSabrina Dubroca <sd@queasysnail.net>
Tue, 14 Oct 2025 09:16:58 +0000 (11:16 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 16 Oct 2025 00:41:45 +0000 (17:41 -0700)
When userspace wants to send a non-DATA record (via the
TLS_SET_RECORD_TYPE cmsg), we need to send any pending data from a
previous MSG_MORE send() as a separate DATA record. If that DATA record
is encrypted asynchronously, tls_handle_open_record will return
-EINPROGRESS. This is currently treated as an error by
tls_process_cmsg, and it will skip setting record_type to the correct
value, but the caller (tls_sw_sendmsg_locked) handles that return
value correctly and proceeds with sending the new message with an
incorrect record_type (DATA instead of whatever was requested in the
cmsg).

Always set record_type before handling the open record. If
tls_handle_open_record returns an error, record_type will be
ignored. If it succeeds, whether with synchronous crypto (returning 0)
or asynchronous (returning -EINPROGRESS), the caller will proceed
correctly.

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/0457252e578a10a94e40c72ba6288b3a64f31662.1760432043.git.sd@queasysnail.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/tls/tls_main.c

index a3ccb3135e51ac6fb01adda8d4198266ff43a646..39a2ab47fe72047d59e81917bb3def8124e73ede 100644 (file)
@@ -255,12 +255,9 @@ int tls_process_cmsg(struct sock *sk, struct msghdr *msg,
                        if (msg->msg_flags & MSG_MORE)
                                return -EINVAL;
 
-                       rc = tls_handle_open_record(sk, msg->msg_flags);
-                       if (rc)
-                               return rc;
-
                        *record_type = *(unsigned char *)CMSG_DATA(cmsg);
-                       rc = 0;
+
+                       rc = tls_handle_open_record(sk, msg->msg_flags);
                        break;
                default:
                        return -EINVAL;