From 030a2b8cb8c4f1d03af6f6e6a3aa3a5a1db5f5a7 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sun, 24 Nov 2013 23:42:54 +0100 Subject: [PATCH] hostip: don't prune DNS cache entries that are in use 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 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/hostip.c b/lib/hostip.c index f37b4925b..5837e64c7 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -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! */