Blame SOURCES/nmap-6.40-allresolve.patch

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