[PATCH net-next v10 3/7] tls: Re-present partially-consumed records in tls_sw_read_sock()
Chuck Lever <[email protected]> Mon, 11 May 2026 19:25:54 -0400
| Newsgroups | dev.linux.lists.kernel-tls-handshake,org.kernel.vger.netdev |
|---|---|
| Message-ID | <[email protected]> |
From: Chuck Lever <[email protected]> When read_actor() accepts only part of a record but desc->count is still non-zero, the receive loop currently falls through to the next iteration without freeing or requeuing the partially consumed skb. The next iteration overwrites skb, leaking the remainder of the current record and silently dropping stream data. __tcp_read_sock() handles the same case by leaving the unread bytes available for the next iteration to re-present, though its mechanism (sequence-number re-lookup) differs from the TLS path's explicit queue management. Adopt the same loop-level behavior here: update rxm->offset and rxm->full_len, requeue the skb to the head of rx_list, and continue. The next iteration pops the same skb and re-presents the unread bytes to read_actor(). Fixes: 662fbcec32f4 ("net/tls: implement ->read_sock()") Cc: Sagi Grimberg <[email protected]> Signed-off-by: Chuck Lever <[email protected]> --- net/tls/tls_sw.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 559bef05fee4..40cb0a92d88a 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -2411,13 +2411,13 @@ int tls_sw_read_sock(struct sock *sk, read_descriptor_t *desc, if (used < rxm->full_len) { rxm->offset += used; rxm->full_len -= used; - if (!desc->count) - goto read_sock_requeue; - } else { - consume_skb(skb); - if (!desc->count) - break; + __skb_queue_head(&ctx->rx_list, skb); + skb = NULL; + continue; } + consume_skb(skb); + if (!desc->count) + break; } read_sock_end: -- 2.54.0