diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2013-11-24 23:42:54 +0100 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2013-11-25 00:10:23 +0100 | 
| commit | 030a2b8cb8c4f1d03af6f6e6a3aa3a5a1db5f5a7 (patch) | |
| tree | fc567c20a0d359be2ba9f8e9a2dcc25fff07c722 /lib | |
| parent | edce855943d3654b259fbb5366fea4fbb40bc86f (diff) | |
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
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/hostip.c | 13 | 
1 files 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! */  | 
