62a8fc
diff -up nmap-6.40/ncat/ncat_connect.c.allresolve nmap-6.40/ncat/ncat_connect.c
62a8fc
--- nmap-6.40/ncat/ncat_connect.c.allresolve	2015-07-07 09:47:11.527409563 +0200
62a8fc
+++ nmap-6.40/ncat/ncat_connect.c	2015-07-07 09:47:11.529409551 +0200
62a8fc
@@ -165,6 +165,7 @@ static struct conn_state cs = {
62a8fc
     0
62a8fc
 };
62a8fc
 
62a8fc
+static void try_nsock_connect(nsock_pool nsp, struct sockaddr_list *conn_addr);
62a8fc
 static void connect_handler(nsock_pool nsp, nsock_event evt, void *data);
62a8fc
 static void post_connect(nsock_pool nsp, nsock_iod iod);
62a8fc
 static void read_stdin_handler(nsock_pool nsp, nsock_event evt, void *data);
62a8fc
@@ -586,7 +587,7 @@ int ncat_connect(void)
62a8fc
 
62a8fc
             if (o.af != AF_INET)
62a8fc
                 bye("Sorry, -g can only currently be used with IPv4.");
62a8fc
-            ipopts = buildsrcrte(targetss.in.sin_addr, o.srcrtes, o.numsrcrtes, o.srcrteptr, &ipoptslen);
62a8fc
+            ipopts = buildsrcrte(targetaddrs->addr.in.sin_addr, o.srcrtes, o.numsrcrtes, o.srcrteptr, &ipoptslen);
62a8fc
 
62a8fc
             nsi_set_ipoptions(cs.sock_nsi, ipopts, ipoptslen);
62a8fc
             free(ipopts); /* Nsock has its own copy */
62a8fc
@@ -596,49 +597,18 @@ int ncat_connect(void)
62a8fc
         if (o.af == AF_UNIX) {
62a8fc
             if (o.proto == IPPROTO_UDP) {
62a8fc
                 nsock_connect_unixsock_datagram(mypool, cs.sock_nsi, connect_handler, NULL,
62a8fc
-                                                &targetss.sockaddr,
62a8fc
-                                                SUN_LEN((struct sockaddr_un *)&targetss.sockaddr));
62a8fc
+                                                &targetaddrs->addr.sockaddr,
62a8fc
+                                                SUN_LEN((struct sockaddr_un *)&targetaddrs->addr.sockaddr));
62a8fc
             } else {
62a8fc
                 nsock_connect_unixsock_stream(mypool, cs.sock_nsi, connect_handler, o.conntimeout,
62a8fc
-                                              NULL, &targetss.sockaddr,
62a8fc
-                                              SUN_LEN((struct sockaddr_un *)&targetss.sockaddr));
62a8fc
+                                              NULL, &targetaddrs->addr.sockaddr,
62a8fc
+                                              SUN_LEN((struct sockaddr_un *)&targetaddrs->addr.sockaddr));
62a8fc
             }
62a8fc
         } else
62a8fc
 #endif
62a8fc
-        if (o.proto == IPPROTO_UDP) {
62a8fc
-            nsock_connect_udp(mypool, cs.sock_nsi, connect_handler,
62a8fc
-                              NULL, &targetss.sockaddr, targetsslen,
62a8fc
-                              inet_port(&targetss));
62a8fc
-        }
62a8fc
-#ifdef HAVE_OPENSSL
62a8fc
-        else if (o.proto == IPPROTO_SCTP && o.ssl) {
62a8fc
-            nsock_connect_ssl(mypool, cs.sock_nsi, connect_handler,
62a8fc
-                              o.conntimeout, NULL,
62a8fc
-                              &targetss.sockaddr, targetsslen,
62a8fc
-                              IPPROTO_SCTP, inet_port(&targetss),
62a8fc
-                              NULL);
62a8fc
-        }
62a8fc
-#endif
62a8fc
-        else if (o.proto == IPPROTO_SCTP) {
62a8fc
-            nsock_connect_sctp(mypool, cs.sock_nsi, connect_handler,
62a8fc
-                              o.conntimeout, NULL,
62a8fc
-                              &targetss.sockaddr, targetsslen,
62a8fc
-                              inet_port(&targetss));
62a8fc
-        }
62a8fc
-#ifdef HAVE_OPENSSL
62a8fc
-        else if (o.ssl) {
62a8fc
-            nsock_connect_ssl(mypool, cs.sock_nsi, connect_handler,
62a8fc
-                              o.conntimeout, NULL,
62a8fc
-                              &targetss.sockaddr, targetsslen,
62a8fc
-                              IPPROTO_TCP, inet_port(&targetss),
62a8fc
-                              NULL);
62a8fc
-        }
62a8fc
-#endif
62a8fc
-        else {
62a8fc
-            nsock_connect_tcp(mypool, cs.sock_nsi, connect_handler,
62a8fc
-                              o.conntimeout, NULL,
62a8fc
-                              &targetss.sockaddr, targetsslen,
62a8fc
-                              inet_port(&targetss));
62a8fc
+        {
62a8fc
+            /* Add connection to first resolved address. */
62a8fc
+            try_nsock_connect(mypool, targetaddrs);
62a8fc
         }
62a8fc
     } else {
62a8fc
         /* A proxy connection. */
62a8fc
@@ -665,8 +635,8 @@ int ncat_connect(void)
62a8fc
             socket_buffer_init(&stateful_buf, connect_socket);
62a8fc
 
62a8fc
             if (o.verbose) {
62a8fc
-                loguser("Connected to proxy %s:%hu\n", inet_socktop(&targetss),
62a8fc
-                    inet_port(&targetss));
62a8fc
+                loguser("Connected to proxy %s:%hu\n", inet_socktop(&targetaddrs->addr),
62a8fc
+                    inet_port(&targetaddrs->addr));
62a8fc
             }
62a8fc
 
62a8fc
             /* Fill the socks4_data struct */
62a8fc
@@ -716,6 +686,8 @@ int ncat_connect(void)
62a8fc
     /* connect */
62a8fc
     rc = nsock_loop(mypool, -1);
62a8fc
 
62a8fc
+    free_sockaddr_list(targetaddrs);
62a8fc
+
62a8fc
     if (o.verbose) {
62a8fc
         struct timeval end_time;
62a8fc
         double time;
62a8fc
@@ -739,19 +711,73 @@ int ncat_connect(void)
62a8fc
     return rc == NSOCK_LOOP_ERROR ? 1 : 0;
62a8fc
 }
62a8fc
 
62a8fc
+static void try_nsock_connect(nsock_pool nsp, struct sockaddr_list *conn_addr)
62a8fc
+{
62a8fc
+    if (o.proto == IPPROTO_UDP) {
62a8fc
+        nsock_connect_udp(nsp, cs.sock_nsi, connect_handler, (void *)conn_addr->next,
62a8fc
+                          &conn_addr->addr.sockaddr, conn_addr->addrlen,
62a8fc
+                          inet_port(&conn_addr->addr));
62a8fc
+    }
62a8fc
+#ifdef HAVE_OPENSSL
62a8fc
+    else if (o.proto == IPPROTO_SCTP && o.ssl) {
62a8fc
+        nsock_connect_ssl(nsp, cs.sock_nsi, connect_handler,
62a8fc
+                          o.conntimeout, (void *)conn_addr->next,
62a8fc
+                          &conn_addr->addr.sockaddr, conn_addr->addrlen,
62a8fc
+                          IPPROTO_SCTP, inet_port(&conn_addr->addr),
62a8fc
+                          NULL);
62a8fc
+    }
62a8fc
+#endif
62a8fc
+    else if (o.proto == IPPROTO_SCTP) {
62a8fc
+        nsock_connect_sctp(nsp, cs.sock_nsi, connect_handler,
62a8fc
+                          o.conntimeout, (void *)conn_addr->next,
62a8fc
+                          &conn_addr->addr.sockaddr, conn_addr->addrlen,
62a8fc
+                          inet_port(&conn_addr->addr));
62a8fc
+    }
62a8fc
+#ifdef HAVE_OPENSSL
62a8fc
+    else if (o.ssl) {
62a8fc
+        nsock_connect_ssl(nsp, cs.sock_nsi, connect_handler,
62a8fc
+                          o.conntimeout, (void *)conn_addr->next,
62a8fc
+                          &conn_addr->addr.sockaddr, conn_addr->addrlen,
62a8fc
+                          IPPROTO_TCP, inet_port(&conn_addr->addr),
62a8fc
+                          NULL);
62a8fc
+    }
62a8fc
+#endif
62a8fc
+    else {
62a8fc
+        nsock_connect_tcp(nsp, cs.sock_nsi, connect_handler,
62a8fc
+                          o.conntimeout, (void *)conn_addr->next,
62a8fc
+                          &conn_addr->addr.sockaddr, conn_addr->addrlen,
62a8fc
+                          inet_port(&conn_addr->addr));
62a8fc
+    }
62a8fc
+}
62a8fc
+
62a8fc
 static void connect_handler(nsock_pool nsp, nsock_event evt, void *data)
62a8fc
 {
62a8fc
     enum nse_status status = nse_status(evt);
62a8fc
     enum nse_type type = nse_type(evt);
62a8fc
+    struct sockaddr_list *next_addr = (struct sockaddr_list *)data;
62a8fc
 
62a8fc
     ncat_assert(type == NSE_TYPE_CONNECT || type == NSE_TYPE_CONNECT_SSL);
62a8fc
 
62a8fc
-    if (status == NSE_STATUS_ERROR) {
62a8fc
-        loguser("%s.\n", socket_strerror(nse_errorcode(evt)));
62a8fc
-        exit(1);
62a8fc
-    } else if (status == NSE_STATUS_TIMEOUT) {
62a8fc
-        loguser("%s.\n", socket_strerror(ETIMEDOUT));
62a8fc
-        exit(1);
62a8fc
+    if (status == NSE_STATUS_ERROR || status == NSE_STATUS_TIMEOUT) {
62a8fc
+        int errcode = (status == NSE_STATUS_TIMEOUT)?ETIMEDOUT:nse_errorcode(evt);
62a8fc
+        /* If there are more resolved addresses, try connecting to next one */
62a8fc
+        if (next_addr != NULL) {
62a8fc
+            if (o.verbose) {
62a8fc
+                union sockaddr_u peer;
62a8fc
+                zmem(&peer, sizeof(peer.storage));
62a8fc
+                nsi_getlastcommunicationinfo(cs.sock_nsi, NULL, NULL, NULL,
62a8fc
+                    &peer.sockaddr, sizeof(peer.storage));
62a8fc
+                loguser("Connection to %s failed: %s.\n", inet_socktop(&peer), socket_strerror(errcode));
62a8fc
+                loguser("Trying next address...\n");
62a8fc
+            }
62a8fc
+            try_nsock_connect(nsp, next_addr);
62a8fc
+            return;
62a8fc
+        }
62a8fc
+        else {
62a8fc
+            free_sockaddr_list(targetaddrs);
62a8fc
+            loguser("%s.\n", socket_strerror(errcode));
62a8fc
+            exit(1);
62a8fc
+        }
62a8fc
     } else {
62a8fc
         ncat_assert(status == NSE_STATUS_SUCCESS);
62a8fc
     }
62a8fc
diff -up nmap-6.40/ncat/ncat_core.c.allresolve nmap-6.40/ncat/ncat_core.c
62a8fc
--- nmap-6.40/ncat/ncat_core.c.allresolve	2013-07-29 00:08:48.000000000 +0200
62a8fc
+++ nmap-6.40/ncat/ncat_core.c	2015-07-07 09:47:11.529409551 +0200
62a8fc
@@ -147,8 +147,7 @@ int num_listenaddrs = 0;
62a8fc
 union sockaddr_u srcaddr;
62a8fc
 size_t srcaddrlen;
62a8fc
 
62a8fc
-union sockaddr_u targetss;
62a8fc
-size_t targetsslen;
62a8fc
+struct sockaddr_list *targetaddrs;
62a8fc
 
62a8fc
 union sockaddr_u httpconnect, socksconnect;
62a8fc
 size_t httpconnectlen, socksconnectlen;
62a8fc
@@ -211,19 +210,23 @@ void options_init(void)
62a8fc
 #endif
62a8fc
 }
62a8fc
 
62a8fc
-/* Internal helper for resolve and resolve_numeric. addl_flags is ored into
62a8fc
-   hints.ai_flags, so you can add AI_NUMERICHOST. */
62a8fc
+/* Internal helper for resolve and resolve_numeric.
62a8fc
+   addl_flags is ored into hints.ai_flags, so you can add AI_NUMERICHOST.
62a8fc
+   sl is a pointer to first element of sockaddr linked list, which is always
62a8fc
+   statically allocated. Next list elements are dynamically allocated.
62a8fc
+   If multiple_addrs is false then only first address is returned. */
62a8fc
 static int resolve_internal(const char *hostname, unsigned short port,
62a8fc
-    struct sockaddr_storage *ss, size_t *sslen, int af, int addl_flags)
62a8fc
+    struct sockaddr_list *sl, int af, int addl_flags, int multiple_addrs)
62a8fc
 {
62a8fc
     struct addrinfo hints;
62a8fc
     struct addrinfo *result;
62a8fc
+    struct addrinfo *next;
62a8fc
+    struct sockaddr_list **item_ptr = &sl;
62a8fc
+    struct sockaddr_list *new_item;
62a8fc
     char portbuf[16];
62a8fc
     int rc;
62a8fc
 
62a8fc
     ncat_assert(hostname != NULL);
62a8fc
-    ncat_assert(ss != NULL);
62a8fc
-    ncat_assert(sslen != NULL);
62a8fc
 
62a8fc
     memset(&hints, 0, sizeof(hints));
62a8fc
     hints.ai_family = af;
62a8fc
@@ -240,8 +243,19 @@ static int resolve_internal(const char *
62a8fc
     if (result == NULL)
62a8fc
         return EAI_NONAME;
62a8fc
     ncat_assert(result->ai_addrlen > 0 && result->ai_addrlen <= (int) sizeof(struct sockaddr_storage));
62a8fc
-    *sslen = result->ai_addrlen;
62a8fc
-    memcpy(ss, result->ai_addr, *sslen);
62a8fc
+    for (next = result; next != NULL; next = next->ai_next) {
62a8fc
+        if (*item_ptr == NULL)
62a8fc
+        {
62a8fc
+            *item_ptr = (struct sockaddr_list *)safe_malloc(sizeof(struct sockaddr_list));
62a8fc
+	    (**item_ptr).next = NULL;
62a8fc
+        }
62a8fc
+        new_item = *item_ptr;
62a8fc
+        new_item->addrlen = next->ai_addrlen;
62a8fc
+        memcpy(&new_item->addr.storage, next->ai_addr, next->ai_addrlen);
62a8fc
+        if (!multiple_addrs)
62a8fc
+            break;
62a8fc
+        item_ptr = &new_item->next;
62a8fc
+    }
62a8fc
     freeaddrinfo(result);
62a8fc
 
62a8fc
     return 0;
62a8fc
@@ -260,12 +274,42 @@ int resolve(const char *hostname, unsign
62a8fc
     struct sockaddr_storage *ss, size_t *sslen, int af)
62a8fc
 {
62a8fc
     int flags;
62a8fc
+    struct sockaddr_list sl;
62a8fc
+    int result;
62a8fc
 
62a8fc
     flags = 0;
62a8fc
     if (o.nodns)
62a8fc
         flags |= AI_NUMERICHOST;
62a8fc
 
62a8fc
-    return resolve_internal(hostname, port, ss, sslen, af, flags);
62a8fc
+    result = resolve_internal(hostname, port, &sl, af, flags, 0);
62a8fc
+    *ss = sl.addr.storage;
62a8fc
+    *sslen = sl.addrlen;
62a8fc
+    return result;
62a8fc
+}
62a8fc
+
62a8fc
+/* Resolves the given hostname or IP address with getaddrinfo, and stores
62a8fc
+   all results into a linked list.
62a8fc
+   The rest of the behavior is same as resolve(). */
62a8fc
+int resolve_multi(const char *hostname, unsigned short port,
62a8fc
+    struct sockaddr_list *sl, int af)
62a8fc
+{
62a8fc
+    int flags;
62a8fc
+
62a8fc
+    flags = 0;
62a8fc
+    if (o.nodns)
62a8fc
+        flags |= AI_NUMERICHOST;
62a8fc
+
62a8fc
+    return resolve_internal(hostname, port, sl, af, flags, 1);
62a8fc
+}
62a8fc
+
62a8fc
+void free_sockaddr_list(struct sockaddr_list *sl)
62a8fc
+{
62a8fc
+    struct sockaddr_list *current, *next = sl;
62a8fc
+    while (next != NULL) {
62a8fc
+        current = next;
62a8fc
+        next = current->next;
62a8fc
+        free(current);
62a8fc
+    }
62a8fc
 }
62a8fc
 
62a8fc
 int fdinfo_close(struct fdinfo *fdn)
62a8fc
diff -up nmap-6.40/ncat/ncat_core.h.allresolve nmap-6.40/ncat/ncat_core.h
62a8fc
--- nmap-6.40/ncat/ncat_core.h.allresolve	2013-07-29 00:08:48.000000000 +0200
62a8fc
+++ nmap-6.40/ncat/ncat_core.h	2015-07-07 09:47:11.529409551 +0200
62a8fc
@@ -130,14 +130,20 @@
62a8fc
    a IPV4 INADDR_ANY and a IPV6 in6addr_any at most or a user defined address */
62a8fc
 #define NUM_LISTEN_ADDRS 2
62a8fc
 
62a8fc
+/* Structure to store a linked list of resolved addresses. */
62a8fc
+struct sockaddr_list {
62a8fc
+    union sockaddr_u addr;
62a8fc
+    size_t addrlen;
62a8fc
+    struct sockaddr_list* next;
62a8fc
+};
62a8fc
+
62a8fc
 extern union sockaddr_u listenaddrs[NUM_LISTEN_ADDRS];
62a8fc
 extern int num_listenaddrs;
62a8fc
 
62a8fc
 extern union sockaddr_u srcaddr;
62a8fc
 extern size_t srcaddrlen;
62a8fc
 
62a8fc
-extern union sockaddr_u targetss;
62a8fc
-extern size_t targetsslen;
62a8fc
+extern struct sockaddr_list *targetaddrs;
62a8fc
 
62a8fc
 extern union sockaddr_u httpconnect, socksconnect;
62a8fc
 extern size_t httpconnectlen, socksconnectlen;
62a8fc
@@ -223,6 +229,14 @@ void options_init(void);
62a8fc
 int resolve(const char *hostname, unsigned short port,
62a8fc
             struct sockaddr_storage *ss, size_t *sslen, int af);
62a8fc
 
62a8fc
+/* Resolves the given hostname or IP address with getaddrinfo, and stores
62a8fc
+   all results into a linked list.
62a8fc
+   The rest of behavior is same as resolve(). */
62a8fc
+int resolve_multi(const char *hostname, unsigned short port,
62a8fc
+        struct sockaddr_list *sl, int af);
62a8fc
+
62a8fc
+void free_sockaddr_list(struct sockaddr_list *sl);
62a8fc
+
62a8fc
 int fdinfo_close(struct fdinfo *fdn);
62a8fc
 int fdinfo_recv(struct fdinfo *fdn, char *buf, size_t size);
62a8fc
 int fdinfo_send(struct fdinfo *fdn, const char *buf, size_t size);
62a8fc
diff -up nmap-6.40/ncat/ncat_main.c.allresolve nmap-6.40/ncat/ncat_main.c
62a8fc
--- nmap-6.40/ncat/ncat_main.c.allresolve	2015-07-07 09:47:11.519409609 +0200
62a8fc
+++ nmap-6.40/ncat/ncat_main.c	2015-07-07 09:50:12.924358800 +0200
62a8fc
@@ -648,15 +648,17 @@ int main(int argc, char *argv[])
62a8fc
     }
62a8fc
 #endif  /* HAVE_SYS_UN_H */
62a8fc
 
62a8fc
+    targetaddrs = (struct sockaddr_list *)safe_zalloc(sizeof(struct sockaddr_list));
62a8fc
+
62a8fc
     /* Will be AF_INET or AF_INET6 or AF_UNIX when valid */
62a8fc
-    memset(&targetss.storage, 0, sizeof(targetss.storage));
62a8fc
-    targetss.storage.ss_family = AF_UNSPEC;
62a8fc
-    httpconnect.storage = socksconnect.storage = srcaddr.storage = targetss.storage;
62a8fc
+    memset(&srcaddr.storage, 0, sizeof(srcaddr.storage));
62a8fc
+    srcaddr.storage.ss_family = AF_UNSPEC;
62a8fc
+    targetaddrs->addr.storage = httpconnect.storage = socksconnect.storage = srcaddr.storage;
62a8fc
 
62a8fc
     /* Clear the listenaddrs array */
62a8fc
     int i;
62a8fc
     for (i = 0; i < NUM_LISTEN_ADDRS; i++) {
62a8fc
-        listenaddrs[i].storage = targetss.storage;
62a8fc
+        listenaddrs[i].storage = srcaddr.storage;
62a8fc
     }
62a8fc
 
62a8fc
     if (proxyaddr) {
62a8fc
@@ -739,10 +741,10 @@ int main(int argc, char *argv[])
62a8fc
     } else {
62a8fc
 #if HAVE_SYS_UN_H
62a8fc
         if (o.af == AF_UNIX) {
62a8fc
-            memset(&targetss.storage, 0, sizeof(struct sockaddr_un));
62a8fc
-            targetss.un.sun_family = AF_UNIX;
62a8fc
-            strncpy(targetss.un.sun_path, argv[optind], sizeof(targetss.un.sun_path));
62a8fc
-            targetsslen = SUN_LEN(&targetss.un);
62a8fc
+            memset(&targetaddrs->addr.storage, 0, sizeof(struct sockaddr_un));
62a8fc
+            targetaddrs->addr.un.sun_family = AF_UNIX;
62a8fc
+            strncpy(targetaddrs->addr.un.sun_path, argv[optind], sizeof(targetaddrs->addr.un.sun_path));
62a8fc
+            targetaddrs->addrlen = SUN_LEN(&targetaddrs->addr.un);
62a8fc
             o.target = argv[optind];
62a8fc
             optind++;
62a8fc
         } else
62a8fc
@@ -753,7 +755,7 @@ int main(int argc, char *argv[])
62a8fc
 
62a8fc
             o.target = argv[optind];
62a8fc
             /* resolve hostname */
62a8fc
-            rc = resolve(o.target, 0, &targetss.storage, &targetsslen, o.af);
62a8fc
+            rc = resolve_multi(o.target, 0, targetaddrs, o.af);
62a8fc
             if (rc != 0)
62a8fc
                 bye("Could not resolve hostname \"%s\": %s.", o.target, gai_strerror(rc));
62a8fc
             optind++;
62a8fc
@@ -789,21 +791,26 @@ int main(int argc, char *argv[])
62a8fc
         o.portno = (unsigned short) long_port;
62a8fc
     }
62a8fc
 
62a8fc
-    if (targetss.storage.ss_family == AF_INET)
62a8fc
-        targetss.in.sin_port = htons(o.portno);
62a8fc
+    struct sockaddr_list *targetaddrs_item = targetaddrs;
62a8fc
+    while (targetaddrs_item != NULL)
62a8fc
+    {
62a8fc
+        if (targetaddrs_item->addr.storage.ss_family == AF_INET)
62a8fc
+            targetaddrs_item->addr.in.sin_port = htons(o.portno);
62a8fc
 #ifdef HAVE_IPV6
62a8fc
-    else if (targetss.storage.ss_family == AF_INET6)
62a8fc
-        targetss.in6.sin6_port = htons(o.portno);
62a8fc
+        else if (targetaddrs_item->addr.storage.ss_family == AF_INET6)
62a8fc
+            targetaddrs_item->addr.in6.sin6_port = htons(o.portno);
62a8fc
 #endif
62a8fc
 #if HAVE_SYS_UN_H
62a8fc
-    /* If we use Unix domain sockets, we have to count with them. */
62a8fc
-    else if (targetss.storage.ss_family == AF_UNIX)
62a8fc
-        ; /* Do nothing. */
62a8fc
+        /* If we use Unix domain sockets, we have to count with them. */
62a8fc
+        else if (targetaddrs_item->addr.storage.ss_family == AF_UNIX)
62a8fc
+            ; /* Do nothing. */
62a8fc
 #endif
62a8fc
-    else if (targetss.storage.ss_family == AF_UNSPEC)
62a8fc
-        ; /* Leave unspecified. */
62a8fc
-    else
62a8fc
-        bye("Unknown address family %d.", targetss.storage.ss_family);
62a8fc
+        else if (targetaddrs_item->addr.storage.ss_family == AF_UNSPEC)
62a8fc
+            ; /* Leave unspecified. */
62a8fc
+        else
62a8fc
+            bye("Unknown address family %d.", targetaddrs_item->addr.storage.ss_family);
62a8fc
+        targetaddrs_item = targetaddrs_item->next;
62a8fc
+    }
62a8fc
 
62a8fc
     if (srcport != -1) {
62a8fc
         if (o.listen) {
62a8fc
@@ -815,7 +822,7 @@ int main(int argc, char *argv[])
62a8fc
                 /* We have a source port but not an explicit source address;
62a8fc
                    fill in an unspecified address of the same family as the
62a8fc
                    target. */
62a8fc
-                srcaddr.storage.ss_family = targetss.storage.ss_family;
62a8fc
+                srcaddr.storage.ss_family = targetaddrs->addr.storage.ss_family;
62a8fc
                 if (srcaddr.storage.ss_family == AF_INET)
62a8fc
                     srcaddr.in.sin_addr.s_addr = INADDR_ANY;
62a8fc
                 else if (srcaddr.storage.ss_family == AF_INET6)
62a8fc
@@ -834,17 +841,17 @@ int main(int argc, char *argv[])
62a8fc
      * need to reverse these address structures to avoid any further confusion
62a8fc
      */
62a8fc
     if (httpconnect.storage.ss_family != AF_UNSPEC) {
62a8fc
-        union sockaddr_u tmp = targetss;
62a8fc
-        size_t tmplen = targetsslen;
62a8fc
-        targetss = httpconnect;
62a8fc
-        targetsslen = httpconnectlen;
62a8fc
+        union sockaddr_u tmp = targetaddrs->addr;
62a8fc
+        size_t tmplen = targetaddrs->addrlen;
62a8fc
+        targetaddrs->addr = httpconnect;
62a8fc
+        targetaddrs->addrlen = httpconnectlen;
62a8fc
         httpconnect = tmp;
62a8fc
         httpconnectlen = tmplen;
62a8fc
     } else if (socksconnect.storage.ss_family != AF_UNSPEC) {
62a8fc
-        union sockaddr_u tmp = targetss;
62a8fc
-        size_t tmplen = targetsslen;
62a8fc
-        targetss = socksconnect;
62a8fc
-        targetsslen = socksconnectlen;
62a8fc
+        union sockaddr_u tmp = targetaddrs->addr;
62a8fc
+        size_t tmplen = targetaddrs->addrlen;
62a8fc
+        targetaddrs->addr = socksconnect;
62a8fc
+        targetaddrs->addrlen = socksconnectlen;
62a8fc
         socksconnect = tmp;
62a8fc
         socksconnectlen = tmplen;
62a8fc
     }
62a8fc
@@ -926,8 +933,8 @@ static int ncat_listen_mode(void)
62a8fc
         bye("/bin/sh is not executable, so `-c' won't work.");
62a8fc
 #endif
62a8fc
 
62a8fc
-    if (targetss.storage.ss_family != AF_UNSPEC) {
62a8fc
-        listenaddrs[num_listenaddrs++] = targetss;
62a8fc
+    if (targetaddrs->addr.storage.ss_family != AF_UNSPEC) {
62a8fc
+        listenaddrs[num_listenaddrs++] = targetaddrs->addr;
62a8fc
     } else {
62a8fc
         size_t ss_len;
62a8fc
         int rc;
62a8fc
diff -up nmap-6.40/ncat/util.c.allresolve nmap-6.40/ncat/util.c
62a8fc
--- nmap-6.40/ncat/util.c.allresolve	2013-07-29 00:08:48.000000000 +0200
62a8fc
+++ nmap-6.40/ncat/util.c	2015-07-07 09:47:11.530409546 +0200
62a8fc
@@ -470,7 +470,7 @@ int do_connect(int type)
62a8fc
     /* We need a socket that can be inherited by child processes in
62a8fc
        ncat_exec_win.c, for --exec and --sh-exec. inheritable_socket is from
62a8fc
        nbase. */
62a8fc
-    sock = inheritable_socket(targetss.storage.ss_family, type, 0);
62a8fc
+    sock = inheritable_socket(targetaddrs->addr.storage.ss_family, type, 0);
62a8fc
 
62a8fc
     if (srcaddr.storage.ss_family != AF_UNSPEC) {
62a8fc
         size_t sa_len;
62a8fc
@@ -487,7 +487,7 @@ int do_connect(int type)
62a8fc
     }
62a8fc
 
62a8fc
     if (sock != -1) {
62a8fc
-        if (connect(sock, &targetss.sockaddr, (int) targetsslen) != -1)
62a8fc
+        if (connect(sock, &targetaddrs->addr.sockaddr, (int) targetaddrs->addrlen) != -1)
62a8fc
             return sock;
62a8fc
         else if (socket_errno() == EINPROGRESS || socket_errno() == EAGAIN)
62a8fc
             return sock;