Commit ec18c955 authored by Richard Sharpe's avatar Richard Sharpe Committed by Andreas Schneider

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: default avatarRichard Sharpe <rsharpe@samba.org>
Signed-off-by: default avatarAndreas Schneider <asn@samba.org>
Reviewed-by: default avatarRalph Boehme <slow@samba.org>
parent 395dc418
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment