]> granicus.if.org Git - curl/commitdiff
hostip: don't prune DNS cache entries that are in use
authorDaniel Stenberg <daniel@haxx.se>
Sun, 24 Nov 2013 22:42:54 +0000 (23:42 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 24 Nov 2013 23:10:23 +0000 (00:10 +0100)
When adding entries to the DNS cache with CURLOPT_RESOLVE, they are
marked 'inuse' forever to prevent them from ever being removed in normal
operations. Still, the code that pruned out-of-date DNS entries didn't
care for the 'inuse' struct field and pruned it anyway!

Reported-by: Romulo A. Ceccon
Bug: http://curl.haxx.se/bug/view.cgi?id=1303

lib/hostip.c

index f37b4925bb3990363a3c8ec0903797aa31ff79fe..5837e64c7d2fbf93e20a850401e44e29aec24a8f 100644 (file)
@@ -291,9 +291,10 @@ remove_entry_if_stale(struct SessionHandle *data, struct Curl_dns_entry *dns)
 {
   struct hostcache_prune_data user;
 
-  if(!dns || (data->set.dns_cache_timeout == -1) || !data->dns.hostcache)
-    /* cache forever means never prune, and NULL hostcache means
-       we can't do it */
+  if(!dns || (data->set.dns_cache_timeout == -1) || !data->dns.hostcache ||
+     dns->inuse)
+    /* cache forever means never prune, and NULL hostcache means we can't do
+       it, if it still is in use then we leave it */
     return 0;
 
   time(&user.now);
@@ -428,9 +429,13 @@ int Curl_resolv(struct connectdata *conn,
   /* free the allocated entry_id again */
   free(entry_id);
 
+  infof(data, "Hostname was %sfound in DNS cache\n", dns?"":"NOT ");
+
   /* See whether the returned entry is stale. Done before we release lock */
-  if(remove_entry_if_stale(data, dns))
+  if(remove_entry_if_stale(data, dns)) {
+    infof(data, "Hostname in DNS cache was stale, zapped\n");
     dns = NULL; /* the memory deallocation is being handled by the hash */
+  }
 
   if(dns) {
     dns->inuse++; /* we use it! */