summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Sharpe <rsharpe@samba.org>2016-05-11 17:03:46 -0700
committerAndreas Schneider <asn@samba.org>2016-05-17 11:44:04 +0200
commitec18c955e13ea2a294339e4c9ee977a769fbe903 (patch)
treea110cecfc18f6318eccd939064bbf990b1d2df39
parent395dc418d996d343cfaeb03be5b720c9e52d1d46 (diff)
downloadsocket_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.c37
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);