[azure 4.13][PATCH 03/19] Revert "UBUNTU: SAUCE: hvsock: fix a race in hvs_stream_dequeue()"

Marcelo Henrique Cerri marcelo.cerri at canonical.com
Tue Dec 12 15:41:52 UTC 2017


From: Dexuan Cui <decui at microsoft.com>

BugLink: http://bugs.launchpad.net/bugs/1736283

This reverts commit 816636283eb0af0f86e09ee6e40a6422d9fb590c.

Signed-off-by: Dexuan Cui <decui at microsoft.com>
Signed-off-by: Marcelo Henrique Cerri <marcelo.cerri at canonical.com>
---
 net/vmw_vsock/hyperv_transport.c | 50 +++++++++++-----------------------------
 1 file changed, 14 insertions(+), 36 deletions(-)

diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c
index 30154836acd0..f465b0b662df 100644
--- a/net/vmw_vsock/hyperv_transport.c
+++ b/net/vmw_vsock/hyperv_transport.c
@@ -476,33 +476,13 @@ static bool hvs_dgram_allow(u32 cid, u32 port)
 	return false;
 }
 
-static int hvs_update_recv_data(struct hvsock *hvs)
-{
-	struct hvs_recv_buf *recv_buf;
-	u32 payload_len;
-
-	recv_buf = (struct hvs_recv_buf *)(hvs->recv_desc + 1);
-	payload_len = recv_buf->hdr.data_size;
-
-	if (payload_len > HVS_MTU_SIZE)
-		return -EIO;
-
-	if (payload_len == 0)
-		hvs->vsk->peer_shutdown |= SEND_SHUTDOWN;
-
-	hvs->recv_data_len = payload_len;
-	hvs->recv_data_off = 0;
-
-	return 0;
-}
-
 static ssize_t hvs_stream_dequeue(struct vsock_sock *vsk, struct msghdr *msg,
 				  size_t len, int flags)
 {
 	struct hvsock *hvs = vsk->trans;
 	bool need_refill = !hvs->recv_desc;
 	struct hvs_recv_buf *recv_buf;
-	u32 to_read;
+	u32 payload_len, to_read;
 	int ret;
 
 	if (flags & MSG_PEEK)
@@ -510,28 +490,29 @@ static ssize_t hvs_stream_dequeue(struct vsock_sock *vsk, struct msghdr *msg,
 
 	if (need_refill) {
 		hvs->recv_desc = hv_pkt_iter_first(hvs->chan);
-		ret = hvs_update_recv_data(hvs);
-		if (ret)
-			return ret;
+		recv_buf = (struct hvs_recv_buf *)(hvs->recv_desc + 1);
+
+		payload_len = recv_buf->hdr.data_size;
+		if (payload_len == 0 || payload_len > HVS_MTU_SIZE)
+			return -EIO;
+
+		hvs->recv_data_len = payload_len;
+		hvs->recv_data_off = 0;
+	} else {
+		recv_buf = (struct hvs_recv_buf *)(hvs->recv_desc + 1);
 	}
 
-	recv_buf = (struct hvs_recv_buf *)(hvs->recv_desc + 1);
 	to_read = min_t(u32, len, hvs->recv_data_len);
 	ret = memcpy_to_msg(msg, recv_buf->data + hvs->recv_data_off, to_read);
 	if (ret != 0)
 		return ret;
 
 	hvs->recv_data_len -= to_read;
-	if (hvs->recv_data_len == 0) {
+
+	if (hvs->recv_data_len == 0)
 		hvs->recv_desc = hv_pkt_iter_next(hvs->chan, hvs->recv_desc);
-		if (hvs->recv_desc) {
-			ret = hvs_update_recv_data(hvs);
-			if (ret)
-				return ret;
-		}
-	} else {
+	else
 		hvs->recv_data_off += to_read;
-	}
 
 	return to_read;
 }
@@ -573,9 +554,6 @@ static s64 hvs_stream_has_data(struct vsock_sock *vsk)
 	struct hvsock *hvs = vsk->trans;
 	s64 ret;
 
-	if (hvs->recv_data_len > 0)
-		return 1;
-
 	switch (hvs_channel_readable_payload(hvs->chan)) {
 	case 1:
 		ret = 1;
-- 
2.7.4





More information about the kernel-team mailing list