Index: lib/easy.c
===================================================================
RCS file: /cvsroot/curl/curl/lib/easy.c,v
retrieving revision 1.61
diff -u -r1.61 easy.c
--- lib/easy.c	28 Sep 2004 22:26:47 -0000	1.61
+++ lib/easy.c	3 Oct 2004 08:16:55 -0000
@@ -391,11 +391,6 @@
   if(!data)
     return;
 
-  if ( ! (data->share && data->share->hostcache) ) {
-    if ( !Curl_global_host_cache_use(data)) {
-      Curl_hash_destroy(data->hostcache);
-    }
-  }
   Curl_close(data);
 }
 
Index: lib/hostip.c
===================================================================
RCS file: /cvsroot/curl/curl/lib/hostip.c,v
retrieving revision 1.160
diff -u -r1.160 hostip.c
--- lib/hostip.c	24 Jun 2004 15:05:39 -0000	1.160
+++ lib/hostip.c	3 Oct 2004 08:16:55 -0000
@@ -263,8 +263,9 @@
 {
   time_t now;
 
-  if(data->set.dns_cache_timeout == -1)
-    /* cache forever means never prune! */
+  if((data->set.dns_cache_timeout == -1) || !data->hostcache)
+    /* cache forever means never prune, and NULL hostcache means
+       we can't do it */
     return;
 
   if(data->share)
@@ -459,7 +460,11 @@
     }
   }
   else {
+    if(data->share)
+      Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
     dns->inuse++; /* we use it! */
+    if(data->share)
+      Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
     rc = CURLRESOLV_RESOLVED;
   }
 
Index: lib/url.c
===================================================================
RCS file: /cvsroot/curl/curl/lib/url.c,v
retrieving revision 1.411
diff -u -r1.411 url.c
--- lib/url.c	2 Oct 2004 13:01:44 -0000	1.411
+++ lib/url.c	3 Oct 2004 08:16:57 -0000
@@ -204,6 +204,12 @@
   /* Loop through all open connections and kill them one by one */
   while(-1 != ConnectionKillOne(data));
 
+  if ( ! (data->share && data->share->hostcache) ) {
+    if ( !Curl_global_host_cache_use(data)) {
+      Curl_hash_destroy(data->hostcache);
+    }
+  }
+
 #ifdef USE_SSLEAY
   /* Close down all open SSL info and sessions */
   Curl_SSL_Close_All(data);
@@ -1432,6 +1438,17 @@
 
   data = conn->data;
 
+  if(conn->dns_entry)
+    Curl_resolv_unlock(data, conn->dns_entry); /* done with this */
+
+#if defined(CURLDEBUG) && defined(AGGRESIVE_TEST)
+  /* scan for DNS cache entries still marked as in use */
+  Curl_hash_apply(data->hostcache,
+                  NULL, Curl_scan_cache_used);
+#endif
+
+  Curl_hostcache_prune(data); /* kill old DNS cache entries */
+
   /*
    * The range string is usually freed in curl_done(), but we might
    * get here *instead* if we fail prematurely. Thus we need to be able
@@ -3230,8 +3247,7 @@
   if(conn->bits.reuse) {
     /* re-used connection, no resolving is necessary */
     hostaddr = NULL;
-    conn->dns_entry = NULL; /* we don't connect now so we don't have any fresh
-                               dns entry struct to point to */
+    /* we'll need to clear conn->dns_entry later in Curl_disconnect() */
 
     if (conn->bits.httpproxy)
       fix_hostname(conn, &conn->host);
@@ -3480,17 +3496,6 @@
     conn->newurl = NULL;
   }
 
-  if(conn->dns_entry)
-    Curl_resolv_unlock(conn->data, conn->dns_entry); /* done with this */
-
-#if defined(CURLDEBUG) && defined(AGGRESIVE_TEST)
-  /* scan for DNS cache entries still marked as in use */
-  Curl_hash_apply(data->hostcache,
-                  NULL, Curl_scan_cache_used);
-#endif
-
-  Curl_hostcache_prune(data); /* kill old DNS cache entries */
-
   /* this calls the protocol-specific function pointer previously set */
   if(conn->curl_done)
     result = conn->curl_done(conn, status);
Index: tests/data/test506
===================================================================
RCS file: /cvsroot/curl/curl/tests/data/test506,v
retrieving revision 1.5
diff -u -r1.5 test506
--- tests/data/test506	11 Sep 2004 19:12:37 -0000	1.5
+++ tests/data/test506	3 Oct 2004 08:16:57 -0000
@@ -79,11 +79,11 @@
 lock:   cookie <Pigs in space>: 12
 unlock: cookie <Pigs in space>: 13
 run 1: set cookie 1, 2 and 3
+CLEANUP
 lock:   dns    <Pigs in space>: 14
 unlock: dns    <Pigs in space>: 15
 lock:   dns    <Pigs in space>: 16
 unlock: dns    <Pigs in space>: 17
-CLEANUP
 lock:   cookie <Pigs in space>: 18
 unlock: cookie <Pigs in space>: 19
 *** run 2
@@ -93,49 +93,53 @@
 PERFORM
 lock:   dns    <Pigs in space>: 22
 unlock: dns    <Pigs in space>: 23
-lock:   cookie <Pigs in space>: 24
-unlock: cookie <Pigs in space>: 25
+lock:   dns    <Pigs in space>: 24
+unlock: dns    <Pigs in space>: 25
 lock:   cookie <Pigs in space>: 26
 unlock: cookie <Pigs in space>: 27
 lock:   cookie <Pigs in space>: 28
 unlock: cookie <Pigs in space>: 29
+lock:   cookie <Pigs in space>: 30
+unlock: cookie <Pigs in space>: 31
 run 2: set cookie 4 and 5
-lock:   dns    <Pigs in space>: 30
-unlock: dns    <Pigs in space>: 31
+CLEANUP
 lock:   dns    <Pigs in space>: 32
 unlock: dns    <Pigs in space>: 33
-CLEANUP
-lock:   cookie <Pigs in space>: 34
-unlock: cookie <Pigs in space>: 35
+lock:   dns    <Pigs in space>: 34
+unlock: dns    <Pigs in space>: 35
+lock:   cookie <Pigs in space>: 36
+unlock: cookie <Pigs in space>: 37
 *** run 3
 CURLOPT_SHARE
-lock:   share  <Pigs in space>: 36
-unlock: share  <Pigs in space>: 37
+lock:   share  <Pigs in space>: 38
+unlock: share  <Pigs in space>: 39
 CURLOPT_COOKIEJAR
 PERFORM
-lock:   dns    <Pigs in space>: 38
-unlock: dns    <Pigs in space>: 39
-lock:   cookie <Pigs in space>: 40
-unlock: cookie <Pigs in space>: 41
-lock:   cookie <Pigs in space>: 42
-unlock: cookie <Pigs in space>: 43
+lock:   dns    <Pigs in space>: 40
+unlock: dns    <Pigs in space>: 41
+lock:   dns    <Pigs in space>: 42
+unlock: dns    <Pigs in space>: 43
 lock:   cookie <Pigs in space>: 44
 unlock: cookie <Pigs in space>: 45
+lock:   cookie <Pigs in space>: 46
+unlock: cookie <Pigs in space>: 47
+lock:   cookie <Pigs in space>: 48
+unlock: cookie <Pigs in space>: 49
 run 3: overwrite cookie 1 and 4
-lock:   dns    <Pigs in space>: 46
-unlock: dns    <Pigs in space>: 47
-lock:   dns    <Pigs in space>: 48
-unlock: dns    <Pigs in space>: 49
 try SHARE_CLEANUP...
 lock:   share  <Pigs in space>: 50
 unlock: share  <Pigs in space>: 51
 SHARE_CLEANUP failed, correct
 CLEANUP
-lock:   cookie <Pigs in space>: 52
-unlock: cookie <Pigs in space>: 53
+lock:   dns    <Pigs in space>: 52
+unlock: dns    <Pigs in space>: 53
+lock:   dns    <Pigs in space>: 54
+unlock: dns    <Pigs in space>: 55
+lock:   cookie <Pigs in space>: 56
+unlock: cookie <Pigs in space>: 57
 SHARE_CLEANUP
-lock:   share  <Pigs in space>: 54
-unlock: share  <Pigs in space>: 55
+lock:   share  <Pigs in space>: 58
+unlock: share  <Pigs in space>: 59
 GLOBAL_CLEANUP
 </stdout>
 <stderr>
