Fix assertion failure at usfstl_vhost_user_read_msg am: 476eb906a5
Original change: https://android-review.googlesource.com/c/platform/external/wmediumd/+/1771031
Change-Id: I8c201280db3446e2a82f3709e6a218f77df1738c
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)