On Mon, Sep 7, 2015 at 12:32 PM, Remi Gacogne <[email protected]> wrote: > Hi, > > On 09/07/2015 10:47 AM, Baptiste wrote: >>> It fails that way: >>> >>> socket(PF_INET,SOCK_DGRAM,17) = (0x4) >>> connect(4,{ AF_INET 8.8.8.8:53 },128) ERR#22 'Invalid argument' >>> >>> 3rd argument for connect() looks wrong for ipv4: >>> >>> ERRORS >>> The connect() system call fails if: >>> >>> [EINVAL] The namelen argument is not a valid length for the >>> address family. >>> >>> >> >> Ok, excellent. >> I wonder how this could happen :) > > It looks like this code is passing the size of a struct > sockaddr_storage to connect(), instead of the size corresponding to the > underlying socket family. Some OS are forgiving, other not so much :) > > diff --git a/src/dns.c b/src/dns.c > index 4bc5448..f725ff4 100644 > --- a/src/dns.c > +++ b/src/dns.c > @@ -819,7 +819,7 @@ int dns_init_resolvers(void) > } > > /* "connect" the UDP socket to the name server IP */ > - if (connect(fd, (struct > sockaddr*)&curnameserver->addr, sizeof(curnameserver->addr)) == -1) { > + if (connect(fd, (struct > sockaddr*)&curnameserver->addr, get_addr_len(&curnameserver->addr)) == -1) { > Alert("Starting [%s/%s] nameserver: > can't connect socket.\n", curr_resolvers->id, > curnameserver->id); > close(fd); > > >
Thanks a lot Remi! Piba, could you please check it works with Remi's feedback? If yes, I'll send a patch to Willy with the fix. Baptiste

