From ec18c955e13ea2a294339e4c9ee977a769fbe903 Mon Sep 17 00:00:00 2001 From: Richard Sharpe Date: Wed, 11 May 2016 17:03:46 -0700 Subject: swrap: Fix sendto() with connected sockets Let the socket wrapper code work with the net ads dns gethostbyname etc code (lib/addn/dnssock.c) which uses connect on a UDP socket before then using sendto and recvfrom. Here, we make sure we don't error out in that case. Tested by creating a test case for this and then observing that: 1. The test case works when the socket wrapper lib is not being used ie, run the test directly after defining some SHELL variables. 2. That the test case fails when run with the un modified socket wrapper code. 3. Apply this fix and observe that it runs correctly. Pair-Programmed-With: Andreas Schneider Signed-off-by: Richard Sharpe Signed-off-by: Andreas Schneider Reviewed-by: Ralph Boehme --- src/socket_wrapper.c | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c index 068cb08..ba289e6 100644 --- a/src/socket_wrapper.c +++ b/src/socket_wrapper.c @@ -3922,9 +3922,15 @@ static ssize_t swrap_sendmsg_before(int fd, } case SOCK_DGRAM: if (si->connected) { - if (msg->msg_name) { - errno = EISCONN; - return -1; + if (msg->msg_name != NULL) { + /* + * We are dealing with unix sockets and if we + * are connected, we should only talk to the + * connected unix path. Using the fd to send + * to another server would be hard to achieve. + */ + msg->msg_name = NULL; + msg->msg_namelen = 0; } } else { const struct sockaddr *msg_name; @@ -4471,12 +4477,25 @@ static ssize_t swrap_sendto(int s, const void *buf, size_t len, int flags, return len; } - ret = libc_sendto(s, - buf, - len, - flags, - (struct sockaddr *)msg.msg_name, - msg.msg_namelen); + /* + * If it is a dgram socket and we are connected, don't include the + * 'to' address. + */ + if (si->type == SOCK_DGRAM && si->connected) { + ret = libc_sendto(s, + buf, + len, + flags, + NULL, + 0); + } else { + ret = libc_sendto(s, + buf, + len, + flags, + (struct sockaddr *)msg.msg_name, + msg.msg_namelen); + } swrap_sendmsg_after(s, si, &msg, to, ret); -- cgit