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:
parent
8f9b4c6a1e
commit
d2d5bec62c
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user