[w32socket] Use coop handles for System.Net.Dns.GetHostByName_internal
authorAleksey Kliger <aleksey@xamarin.com>
Tue, 30 May 2017 18:57:09 +0000 (14:57 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Tue, 30 May 2017 18:57:09 +0000 (14:57 -0400)
mono/metadata/icall-def.h
mono/metadata/w32socket.c
mono/metadata/w32socket.h

index 7a89976364794f74dd2050a7a261172f7a90fff9..b52a75da69f3ef5065120f00c31282b156529418 100644 (file)
@@ -444,7 +444,7 @@ HANDLES(ICALL(MCATTR_3, "IsDefinedInternal", ves_icall_MonoCustomAttrs_IsDefined
 #ifndef DISABLE_SOCKETS
 ICALL_TYPE(NDNS, "System.Net.Dns", NDNS_1)
 ICALL(NDNS_1, "GetHostByAddr_internal(string,string&,string[]&,string[]&,int)", ves_icall_System_Net_Dns_GetHostByAddr_internal)
-ICALL(NDNS_2, "GetHostByName_internal(string,string&,string[]&,string[]&,int)", ves_icall_System_Net_Dns_GetHostByName_internal)
+HANDLES(ICALL(NDNS_2, "GetHostByName_internal(string,string&,string[]&,string[]&,int)", ves_icall_System_Net_Dns_GetHostByName_internal))
 HANDLES(ICALL(NDNS_3, "GetHostName_internal(string&)", ves_icall_System_Net_Dns_GetHostName_internal))
 
 #if defined(PLATFORM_MACOSX) || defined(PLATFORM_BSD)
index cccc157193fb83b0b59c42d1b19fb637a7056d11..80b053954461e07ff93e2d70fe917d11ee192c18 100644 (file)
@@ -2592,26 +2592,26 @@ leave:
 }
 
 MonoBoolean
-ves_icall_System_Net_Dns_GetHostByName_internal (MonoString *host, MonoString **h_name, MonoArray **h_aliases, MonoArray **h_addr_list, gint32 hint)
+ves_icall_System_Net_Dns_GetHostByName_internal (MonoStringHandle host, MonoStringHandleOut h_name, MonoArrayHandleOut h_aliases, MonoArrayHandleOut h_addr_list, gint32 hint, MonoError *error)
 {
-       MonoError error;
        gboolean add_local_ips = FALSE, add_info_ok = TRUE;
        gchar this_hostname [256];
        MonoAddressInfo *info = NULL;
 
-       char *hostname = mono_string_to_utf8_checked (host, &error);
-       if (mono_error_set_pending_exception (&error))
-               return FALSE;
+       error_init (error);
+
+       char *hostname = mono_string_handle_to_utf8 (host, error);
+       return_val_if_nok (error, FALSE);
 
        if (*hostname == '\0') {
                add_local_ips = TRUE;
-               *h_name = host;
+               MONO_HANDLE_ASSIGN (h_name, host);
        }
 
        if (!add_local_ips && gethostname (this_hostname, sizeof (this_hostname)) != -1) {
                if (!strcmp (hostname, this_hostname)) {
                        add_local_ips = TRUE;
-                       *h_name = host;
+                       MONO_HANDLE_ASSIGN (h_name, host);
                }
        }
 
@@ -2629,8 +2629,7 @@ ves_icall_System_Net_Dns_GetHostByName_internal (MonoString *host, MonoString **
        g_free(hostname);
 
        if (add_info_ok) {
-               MonoBoolean result = addrinfo_to_IPHostEntry (info, h_name, h_aliases, h_addr_list, add_local_ips, &error);
-               mono_error_set_pending_exception (&error);
+               MonoBoolean result = addrinfo_to_IPHostEntry_handles (info, h_name, h_aliases, h_addr_list, add_local_ips, error);
                return result;
        }
        return FALSE;
index 9639910f7de9000da002a73c26ace18c4f023f35..759059f504c470f06ff47ef7d8b40a46fcb656c7 100644 (file)
@@ -247,8 +247,9 @@ ves_icall_System_Net_Sockets_Socket_IOControl_internal (gsize sock, gint32 code,
        gint32 *error);
 
 MonoBoolean
-ves_icall_System_Net_Dns_GetHostByName_internal (MonoString *host, MonoString **h_name, MonoArray **h_aliases,
-       MonoArray **h_addr_list, gint32 hint);
+ves_icall_System_Net_Dns_GetHostByName_internal (MonoStringHandle host, MonoStringHandleOut h_name,
+                                                MonoArrayHandleOut h_aliases, MonoArrayHandleOut h_addr_list,
+                                                gint32 hint, MonoError *error);
 
 MonoBoolean
 ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoString *addr, MonoString **h_name, MonoArray **h_aliases,