diff options
Diffstat (limited to 'net/tls/tls_sw.c')
| -rw-r--r-- | net/tls/tls_sw.c | 24 | 
1 files changed, 16 insertions, 8 deletions
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 9fbc70200cd0..de96959336c4 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -1772,7 +1772,8 @@ static int process_rx_list(struct tls_sw_context_rx *ctx,  			   u8 *control,  			   size_t skip,  			   size_t len, -			   bool is_peek) +			   bool is_peek, +			   bool *more)  {  	struct sk_buff *skb = skb_peek(&ctx->rx_list);  	struct tls_msg *tlm; @@ -1785,7 +1786,7 @@ static int process_rx_list(struct tls_sw_context_rx *ctx,  		err = tls_record_content_type(msg, tlm, control);  		if (err <= 0) -			goto out; +			goto more;  		if (skip < rxm->full_len)  			break; @@ -1803,12 +1804,12 @@ static int process_rx_list(struct tls_sw_context_rx *ctx,  		err = tls_record_content_type(msg, tlm, control);  		if (err <= 0) -			goto out; +			goto more;  		err = skb_copy_datagram_msg(skb, rxm->offset + skip,  					    msg, chunk);  		if (err < 0) -			goto out; +			goto more;  		len = len - chunk;  		copied = copied + chunk; @@ -1844,6 +1845,10 @@ static int process_rx_list(struct tls_sw_context_rx *ctx,  out:  	return copied ? : err; +more: +	if (more) +		*more = true; +	goto out;  }  static bool @@ -1947,6 +1952,7 @@ int tls_sw_recvmsg(struct sock *sk,  	int target, err;  	bool is_kvec = iov_iter_is_kvec(&msg->msg_iter);  	bool is_peek = flags & MSG_PEEK; +	bool rx_more = false;  	bool released = true;  	bool bpf_strp_enabled;  	bool zc_capable; @@ -1966,12 +1972,12 @@ int tls_sw_recvmsg(struct sock *sk,  		goto end;  	/* Process pending decrypted records. It must be non-zero-copy */ -	err = process_rx_list(ctx, msg, &control, 0, len, is_peek); +	err = process_rx_list(ctx, msg, &control, 0, len, is_peek, &rx_more);  	if (err < 0)  		goto end;  	copied = err; -	if (len <= copied) +	if (len <= copied || (copied && control != TLS_RECORD_TYPE_DATA) || rx_more)  		goto end;  	target = sock_rcvlowat(sk, flags & MSG_WAITALL, len); @@ -2064,6 +2070,8 @@ put_on_rx_list:  				decrypted += chunk;  				len -= chunk;  				__skb_queue_tail(&ctx->rx_list, skb); +				if (unlikely(control != TLS_RECORD_TYPE_DATA)) +					break;  				continue;  			} @@ -2128,10 +2136,10 @@ recv_end:  		/* Drain records from the rx_list & copy if required */  		if (is_peek || is_kvec)  			err = process_rx_list(ctx, msg, &control, copied, -					      decrypted, is_peek); +					      decrypted, is_peek, NULL);  		else  			err = process_rx_list(ctx, msg, &control, 0, -					      async_copy_bytes, is_peek); +					      async_copy_bytes, is_peek, NULL);  	}  	copied += decrypted;  |