From 5fedb171148c114f2488f5bff941942226b31eef Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Sat, 28 Mar 2009 07:51:24 +0100 Subject: [PATCH] Fix bug #2709: TCP connect returns Invalid argument. The getaddrinfo result (struct addrinfo) is now properly updated in the sp->ai member .. Hence socket and connect uses same address. The poking for IPV6 address types, bug #2350, is now useless. --- src/tcpip.c | 38 +++++++++++--------------------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/src/tcpip.c b/src/tcpip.c index 57a4bda..97461da 100644 --- a/src/tcpip.c +++ b/src/tcpip.c @@ -419,26 +419,6 @@ int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add, } #if HAVE_GETADDRINFO -/** \brief Creates socket using particular address family (AF_) - \param ai getaddrinfo result - \param mask family mask - \returns socket or -1 if none could be created - -*/ -static int create_socket_family(struct addrinfo *ai, unsigned mask) -{ - for (; ai; ai = ai->ai_next) - { - if ((ai->ai_family & mask) == mask) - { - int s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); - if (s != -1) - return s; - } - } - return -1; -} - void *tcpip_straddr(COMSTACK h, const char *str) { tcpip_state *sp = (tcpip_state *)h->cprivate; @@ -453,13 +433,17 @@ void *tcpip_straddr(COMSTACK h, const char *str) sp->ai = tcpip_getaddrinfo(str, port); if (sp->ai && h->state == CS_ST_UNBND) { - /* The getaddrinfo call may return multiple addresses when passive - flags are used (AI_PASSIVE). This function picks the IPV6 if a - socket can be created for it. Otherwise IPV4 is used. - See also bug #2350 */ - int s = create_socket_family(sp->ai, AF_INET6); - if (s == -1) - s = create_socket_family(sp->ai, AF_INET); + int s = -1; + struct addrinfo *ai = sp->ai; + for (; ai; ai = ai->ai_next) + { + s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + if (s != -1) + { + sp->ai = ai; + break; + } + } if (s == -1) return 0; h->iofile = s; -- 1.7.10.4