MFp4 @1189139:

Get rid of the msg_peek() function, which has a problem.  If there was less
data in the socket buffer than requested by the caller, the function would busy
loop, as select(2) will always return immediately.

We can just receive nvlhdr now, because some time ago we splitted receive of
data from the receive of descriptors.

MFC after:	1 week
This commit is contained in:
Pawel Jakub Dawidek 2013-12-15 22:58:09 +00:00
parent 396b29c74e
commit 518eeaeeca
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=259430
3 changed files with 5 additions and 29 deletions

View File

@ -113,30 +113,6 @@ fd_wait(int fd, bool doread)
NULL, NULL);
}
int
msg_peek(int sock, void *buf, size_t size)
{
ssize_t done;
PJDLOG_ASSERT(sock >= 0);
PJDLOG_ASSERT(size > 0);
do {
fd_wait(sock, true);
done = recv(sock, buf, size, MSG_PEEK | MSG_WAITALL);
if (done == -1) {
if (errno == EAGAIN || errno == EINTR)
continue;
return (-1);
} else if (done == 0) {
errno = ENOTCONN;
return (-1);
}
} while (done != (ssize_t)size);
return (0);
}
static int
msg_recv(int sock, struct msghdr *msg)
{

View File

@ -38,8 +38,6 @@ struct cmsgcred;
struct iovec;
struct msghdr;
int msg_peek(int sock, void *buf, size_t size);
int cred_send(int sock);
int cred_recv(int sock, struct cmsgcred *cred);

View File

@ -724,11 +724,11 @@ nvlist_recv(int sock)
{
struct nvlist_header nvlhdr;
nvlist_t *nvl, *ret;
unsigned char *buf;
size_t nfds, size;
void *buf;
int serrno, *fds;
if (msg_peek(sock, &nvlhdr, sizeof(nvlhdr)) == -1)
if (buf_recv(sock, &nvlhdr, sizeof(nvlhdr)) == -1)
return (NULL);
if (!nvlist_check_header(&nvlhdr))
@ -741,10 +741,12 @@ nvlist_recv(int sock)
if (buf == NULL)
return (NULL);
memcpy(buf, &nvlhdr, sizeof(nvlhdr));
ret = NULL;
fds = NULL;
if (buf_recv(sock, buf, size) == -1)
if (buf_recv(sock, buf + sizeof(nvlhdr), size - sizeof(nvlhdr)) == -1)
goto out;
if (nfds > 0) {