More robust get_address_info
authorBrennanConroy <brecon@microsoft.com>
Thu, 23 Jul 2015 18:52:29 +0000 (11:52 -0700)
committerBrennanConroy <brecon@microsoft.com>
Thu, 23 Jul 2015 18:52:29 +0000 (11:52 -0700)
We have been running into this issue: https://bugzilla.xamarin.com/show_bug.cgi?id=30018 a lot recently, after digging into getaddrinfo a bit we saw that the linked list of addrinfo structs had 1 or more valid ones which can be used and 1 bad one which should just be discarded.

mono/utils/networking-posix.c

index 2fe8da9d9f8fa855d4ba6b1dfbdc189f9d8709a4..ad4a623eda77cd5faaaa7c25ed8fe0bc668e6234 100644 (file)
@@ -76,11 +76,6 @@ mono_get_address_info (const char *hostname, int port, int flags, MonoAddressInf
 
        while (res) {
                cur = g_new0 (MonoAddressEntry, 1);
-               if (prev)
-                       prev->next = cur;
-               else
-                       addr_info->entries = cur;
-
                cur->family = res->ai_family;
                cur->socktype = res->ai_socktype;
                cur->protocol = res->ai_protocol;
@@ -91,12 +86,20 @@ mono_get_address_info (const char *hostname, int port, int flags, MonoAddressInf
                        cur->address_len = sizeof (struct in6_addr);
                        cur->address.v6 = ((struct sockaddr_in6*)res->ai_addr)->sin6_addr;
                } else {
-                       g_error ("Cannot handle address family %d", cur->family);
+                       g_warning ("Cannot handle address family %d", cur->family);
+                       res = res->ai_next;
+                       g_free (cur);
+                       continue;
                }
 
                if (res->ai_canonname)
                        cur->canonical_name = g_strdup (res->ai_canonname);
 
+               if (prev)
+                       prev->next = cur;
+               else
+                       addr_info->entries = cur;
+                       
                prev = cur;
                res = res->ai_next;
        }
@@ -339,4 +342,4 @@ mono_networking_shutdown (void)
 {
        //nothing really
 }
-#endif
\ No newline at end of file
+#endif