diff --git a/lib/hostip.c b/lib/hostip.c
index e82bbe10fceb07769581e00b358cbf7063e4451c..e5363fa8099d1875528500ba30a7651d40a57548 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -307,6 +307,9 @@ int Curl_resolv(struct connectdata *conn,
 
   /* See if its already in our dns cache */
   dns = Curl_hash_pick(data->hostcache, entry_id, entry_len+1);
+  
+  if(data->share)
+    Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
 
   /* free the allocated entry_id again */
   free(entry_id);
@@ -332,12 +335,18 @@ int Curl_resolv(struct connectdata *conn,
       }
     }
     else
+    {
+      if(data->share)
+        Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
+
       /* we got a response, store it in the cache */
       dns = cache_resolv_response(data, addr, hostname, port);
+      
+      if(data->share)
+        Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
+    }
   }
 
-  if(data->share)
-    Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
 
   *entry = dns;
 
diff --git a/tests/data/test506 b/tests/data/test506
index bb9ee3836a4e1dc3caffc84a5ac3006415a087b0..1fbd4bac80d9caaad341b85e9948c6f5c1b19ea9 100644
--- a/tests/data/test506
+++ b/tests/data/test506
@@ -68,6 +68,8 @@ unlock: share   <Pigs in space>
 PERFORM
 lock:   dns     <Pigs in space>
 unlock: dns     <Pigs in space>
+lock:   dns     <Pigs in space>
+unlock: dns     <Pigs in space>
 lock:   cookie  <Pigs in space>
 unlock: cookie  <Pigs in space>
 lock:   cookie  <Pigs in space>