iov_send_recv(): Handle zero bytes case even if OS does not

POSIX allows sendmsg() and recvmsg() to fail EMSGSIZE if passed a zero
msg.msg_iovlen (in particular the MacOS X implementation will do this).
Handle the case where iov_send_recv() is passed a zero byte count
explicitly, to avoid accidentally depending on the OS to treat zero
msg_iovlen as a no-op.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Acked-by: Michael Tokarev <mjt@tls.msk.ru>
Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
This commit is contained in:
Peter Maydell 2012-08-11 22:24:35 +01:00 committed by Stefan Hajnoczi
parent 9c6bb55b86
commit bb9558679f

7
iov.c
View File

@ -146,6 +146,13 @@ ssize_t iov_send_recv(int sockfd, struct iovec *iov, unsigned iov_cnt,
{ {
ssize_t ret; ssize_t ret;
unsigned si, ei; /* start and end indexes */ unsigned si, ei; /* start and end indexes */
if (bytes == 0) {
/* Catch the do-nothing case early, as otherwise we will pass an
* empty iovec to sendmsg/recvmsg(), and not all implementations
* accept this.
*/
return 0;
}
/* Find the start position, skipping `offset' bytes: /* Find the start position, skipping `offset' bytes:
* first, skip all full-sized vector elements, */ * first, skip all full-sized vector elements, */