diff options
Diffstat (limited to 'net/tls/tls_sw.c')
| -rw-r--r-- | net/tls/tls_sw.c | 7 | 
1 files changed, 5 insertions, 2 deletions
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 211f57164cb6..b783231668c6 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -1976,10 +1976,10 @@ int tls_sw_recvmsg(struct sock *sk,  	if (unlikely(flags & MSG_ERRQUEUE))  		return sock_recv_errqueue(sk, msg, len, SOL_IP, IP_RECVERR); -	psock = sk_psock_get(sk);  	err = tls_rx_reader_lock(sk, ctx, flags & MSG_DONTWAIT);  	if (err < 0)  		return err; +	psock = sk_psock_get(sk);  	bpf_strp_enabled = sk_psock_strp_enabled(psock);  	/* If crypto failed the connection is broken */ @@ -2152,12 +2152,15 @@ recv_end:  		}  		/* Drain records from the rx_list & copy if required */ -		if (is_peek || is_kvec) +		if (is_peek)  			err = process_rx_list(ctx, msg, &control, copied + peeked,  					      decrypted - peeked, is_peek, NULL);  		else  			err = process_rx_list(ctx, msg, &control, 0,  					      async_copy_bytes, is_peek, NULL); + +		/* we could have copied less than we wanted, and possibly nothing */ +		decrypted += max(err, 0) - async_copy_bytes;  	}  	copied += decrypted;  |