A zero-length application_data record delivers no payload, so tls_sw_read_sock() never runs the read_actor for one and nothing decrements desc->count. A peer that streams such records keeps the loop running, with the socket lock held, for as long as they arrive. The caller cannot bound the run because read_sock() has not returned. Stop after TLS_RX_NODATA_LIMIT consecutive records that deliver no bytes. Any record that delivers bytes resets the count. Stopping with nothing copied returns zero, which a read_sock consumer takes as no progress rather than EOF. Records left queued raise no further sk_data_ready(), so call the socket's callback before returning. Fixes: 3be28e2c9cd0 ("net/tls: Consume empty data records in tls_sw_read_sock()") Signed-off-by: Chuck Lever --- net/tls/tls_sw.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index d1ad31986cf2..c78471c53f2f 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -2070,6 +2070,8 @@ ssize_t tls_sw_splice_read(struct socket *sock, loff_t *ppos, goto splice_read_end; } +#define TLS_RX_NODATA_LIMIT 16 + int tls_sw_read_sock(struct sock *sk, read_descriptor_t *desc, sk_read_actor_t read_actor) { @@ -2078,6 +2080,7 @@ int tls_sw_read_sock(struct sock *sk, read_descriptor_t *desc, struct tls_prot_info *prot = &tls_ctx->prot_info; struct strp_msg *rxm = NULL; struct sk_buff *skb = NULL; + unsigned int nodata = 0; struct sk_psock *psock; size_t flushed_at = 0; bool released = true; @@ -2136,14 +2139,22 @@ int tls_sw_read_sock(struct sock *sk, read_descriptor_t *desc, goto read_sock_requeue; } - /* An empty data record (legal in TLS 1.3) gives a zero - * read_actor return, indistinguishable from the consumer - * stalling; the used <= 0 path would requeue it at the - * head of rx_list and block all later records. Consume it - * here instead. + /* An empty data record gives a zero read_actor return, + * indistinguishable from the consumer stalling; the + * used <= 0 path would requeue it at the head of rx_list + * and block all later records. Consume it here instead. */ if (rxm->full_len == 0) { + err = 0; consume_skb(skb); + if (++nodata >= TLS_RX_NODATA_LIMIT) { + /* tls_rx_reader_release() calls + * saved_data_ready(), not the callback a + * consumer installs after the handshake. + */ + sk->sk_data_ready(sk); + break; + } continue; } @@ -2154,6 +2165,7 @@ int tls_sw_read_sock(struct sock *sk, read_descriptor_t *desc, goto read_sock_requeue; } copied += used; + nodata = 0; if (used < rxm->full_len) { rxm->offset += used; rxm->full_len -= used; -- 2.55.0