diff options
author | Richard Sharpe <rsharpe@samba.org> | 2016-05-11 17:03:46 -0700 |
---|---|---|
committer | Andreas Schneider <asn@samba.org> | 2016-05-17 11:44:04 +0200 |
commit | ec18c955e13ea2a294339e4c9ee977a769fbe903 (patch) | |
tree | a110cecfc18f6318eccd939064bbf990b1d2df39 | |
parent | 395dc418d996d343cfaeb03be5b720c9e52d1d46 (diff) | |
download | socket_wrapper-ec18c955e13ea2a294339e4c9ee977a769fbe903.tar.gz socket_wrapper-ec18c955e13ea2a294339e4c9ee977a769fbe903.tar.xz socket_wrapper-ec18c955e13ea2a294339e4c9ee977a769fbe903.zip |
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 <asn@samba.org>
Signed-off-by: Richard Sharpe <rsharpe@samba.org>
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
-rw-r--r-- | src/socket_wrapper.c | 37 |
1 files changed, 28 insertions, 9 deletions
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); |