--- C:/Lib/curl-7.23.1/lib/asyn-thread.c	Wed Nov 23 12:53:06 2011
+++ C:/Lib/curl-7.23.1_patched/lib/asyn-thread.c	Fri Dec 23 14:46:35 2011
@@ -142,14 +142,14 @@
   return CURLE_OK;
 }
 
-static void destroy_async_data(struct Curl_async *);
+static void destroy_async_data(struct connectdata *conn);
 
 /*
  * Cancel all possibly still on-going resolves for this connection.
  */
 void Curl_resolver_cancel(struct connectdata *conn)
 {
-  destroy_async_data(&conn->async);
+  destroy_async_data(conn);
 }
 
 /* This function is used to init a threaded resolve */
@@ -321,8 +321,10 @@
 /*
  * destroy_async_data() cleans up async resolver data and thread handle.
  */
-static void destroy_async_data (struct Curl_async *async)
+static void destroy_async_data(struct connectdata *conn)
 {
+  struct Curl_async *async = &conn->async;
+
   if(async->hostname)
     free(async->hostname);
 
@@ -330,7 +332,7 @@
     struct thread_data *td = (struct thread_data*) async->os_specific;
 
     if(td->dummy_sock != CURL_SOCKET_BAD)
-      sclose(td->dummy_sock);
+       Curl_closesocket(conn, td->dummy_sock);
 
     if(td->thread_hnd != curl_thread_t_null)
       Curl_thread_join(&td->thread_hnd);
@@ -380,7 +382,19 @@
    * should never become signalled for read since it's unbound but
    * Windows needs at least 1 socket in select().
    */
-  td->dummy_sock = socket(AF_INET, SOCK_DGRAM, 0);
+  if(conn->data->set.fopensocket) {
+    struct curl_sockaddr empty_addr;
+    memset(&empty_addr, 0, sizeof(empty_addr));
+    /* we pass in a blanked struct as a safe-guard in case older applications
+       don't properly verify the socket's purpose before reading the address
+       struct */
+    td->dummy_sock = conn->data->set.fopensocket(conn->data->set.opensocket_client,
+                                                 CURLSOCKTYPE_DUMMY,
+                                                 &empty_addr);
+  }
+  else
+    td->dummy_sock = socket(AF_INET, SOCK_DGRAM, 0);
+
   if(td->dummy_sock == CURL_SOCKET_BAD)
     goto err_exit;
 #endif
@@ -401,7 +415,7 @@
   return TRUE;
 
  err_exit:
-  destroy_async_data(&conn->async);
+  destroy_async_data(conn);
 
   SET_ERRNO(err);
 
@@ -506,7 +520,7 @@
     }
   }
 
-  destroy_async_data(&conn->async);
+  destroy_async_data(conn);
 
   if(!conn->async.dns)
     conn->bits.close = TRUE;
@@ -539,7 +553,7 @@
 
   if(done) {
     getaddrinfo_complete(conn);
-    destroy_async_data(&conn->async);
+    destroy_async_data(conn);
 
     if(!conn->async.dns) {
       resolver_error(conn, "host");
