Fix assertion failure at usfstl_vhost_user_read_msg am: 476eb906a5 am: c725dc3a12 am: 6396a33de0

Original change: https://android-review.googlesource.com/c/platform/external/wmediumd/+/1771031

Change-Id: I1b284e667ca897b1677387d3571fe5251d889c01
diff --git a/wmediumd/lib/vhost.c b/wmediumd/lib/vhost.c
index 0b9a571..3f561dc 100644
--- a/wmediumd/lib/vhost.c
+++ b/wmediumd/lib/vhost.c
@@ -175,6 +175,8 @@
 	size_t i;
 	size_t maxlen = 0;
 	ssize_t len;
+	ssize_t prev_datalen;
+	size_t prev_iovlen;
 
 	USFSTL_ASSERT(msghdr->msg_iovlen >= 1);
 	USFSTL_ASSERT(msghdr->msg_iov[0].iov_len >= sizeof(*hdr));
@@ -199,18 +201,24 @@
 	if (!hdr->size)
 		return 0;
 
+	prev_iovlen = msghdr->msg_iovlen;
+	msghdr->msg_iovlen = 1;
+
 	msghdr->msg_control = NULL;
 	msghdr->msg_controllen = 0;
 	msghdr->msg_iov[0].iov_base += sizeof(*hdr);
-	msghdr->msg_iov[0].iov_len -= sizeof(*hdr);
+	prev_datalen = msghdr->msg_iov[0].iov_len;
+	msghdr->msg_iov[0].iov_len = hdr->size;
 	len = recvmsg(fd, msghdr, 0);
 
 	/* restore just in case the user needs it */
 	msghdr->msg_iov[0].iov_base -= sizeof(*hdr);
-	msghdr->msg_iov[0].iov_len += sizeof(*hdr);
+	msghdr->msg_iov[0].iov_len = prev_datalen;
 	msghdr->msg_control = hdr2.msg_control;
 	msghdr->msg_controllen = hdr2.msg_controllen;
 
+	msghdr->msg_iovlen = prev_iovlen;
+
 	if (len < 0)
 		return -errno;
 	if (len == 0)