Blame SOURCES/nmap-6.40-allresolve.patch

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