]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Correctly remove all duplicates when having many hostnames in an invitation URL.
[meshlink] / src / meshlink.c
index 9f9b771dc5589598df24ff18a7a06048199b161a..f87e4de0ec8326d34c07cc5b6b9a196ea10adbda 100644 (file)
@@ -446,7 +446,7 @@ static char *get_my_hostname(meshlink_handle_t *mesh, uint32_t flags) {
 
                        if(colon) {
                                *colon = 0;
-                               port[n] = colon + 1;
+                               port[n] = xstrdup(colon + 1);
                        }
 
                        n++;
@@ -482,17 +482,17 @@ static char *get_my_hostname(meshlink_handle_t *mesh, uint32_t flags) {
                }
        }
 
-       for(int i = 0; i < 4; i++) {
+       for(int i = 0; i < n; i++) {
                // Ensure we always have a port number
                if(hostname[i] && !port[i]) {
                        port[i] = xstrdup(mesh->myport);
                }
        }
 
-       remove_duplicate_hostnames(hostname, port, 4);
+       remove_duplicate_hostnames(hostname, port, n);
 
        // Resolve the hostnames
-       for(int i = 0; i < 4; i++) {
+       for(int i = 0; i < n; i++) {
                if(!hostname[i]) {
                        continue;
                }
@@ -510,8 +510,10 @@ static char *get_my_hostname(meshlink_handle_t *mesh, uint32_t flags) {
                        continue;
                }
 
-               // Remember the address
-               node_add_recent_address(mesh, mesh->self, (sockaddr_t *)ai_in->ai_addr);
+               // Remember the address(es)
+               for(struct addrinfo *aip = ai_in; aip; aip = aip->ai_next) {
+                       node_add_recent_address(mesh, mesh->self, (sockaddr_t *)aip->ai_addr);
+               }
 
                if(flags & MESHLINK_INVITE_NUMERIC) {
                        // We don't need to do any further conversion
@@ -554,10 +556,10 @@ static char *get_my_hostname(meshlink_handle_t *mesh, uint32_t flags) {
        }
 
        // Remove duplicates again, since IPv4 and IPv6 addresses might map to the same hostname
-       remove_duplicate_hostnames(hostname, port, 4);
+       remove_duplicate_hostnames(hostname, port, n);
 
        // Concatenate all unique address to the hostport string
-       for(int i = 0; i < 4; i++) {
+       for(int i = 0; i < n; i++) {
                if(!hostname[i]) {
                        continue;
                }