diff options
| author | Alibek.Jorajev <ajorajev@blackberry.com> | 2018-05-30 15:23:35 +0100 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2018-06-01 12:47:52 +0200 | 
| commit | f66d97b677d114733f6b938d54ce7502d6aff214 (patch) | |
| tree | 6727cfc6ce56762771a85a44f5061f968adc0784 /lib | |
| parent | a115c6bbe73175ad6157fce67338d4a18ed768b2 (diff) | |
CURLOPT_RESOLVE: always purge old entry first
If there's an existing entry using the selected name.
Closes #2622
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/hostip.c | 34 | 
1 files changed, 19 insertions, 15 deletions
diff --git a/lib/hostip.c b/lib/hostip.c index c2f9defd9..d809578e1 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -1010,24 +1010,28 @@ CURLcode Curl_loadhostpairs(struct Curl_easy *data)        /* See if its already in our dns cache */        dns = Curl_hash_pick(data->dns.hostcache, entry_id, entry_len + 1); +      if(dns) { +        infof(data, "RESOLVE %s:%d is - old addresses discarded!\n", +                hostname, port); +        /* delete old entry entry, there are two reasons for this +         1. old entry may have different addresses. +         2. even if entry with correct addresses is already in the cache, +            but if it is close to expire, then by the time next http +            request is made, it can get expired and pruned because old +            entry is not necessarily marked as added by CURLOPT_RESOLVE. */ + +        Curl_hash_delete(data->dns.hostcache, entry_id, entry_len + 1); +      }        /* free the allocated entry_id again */        free(entry_id); -      if(!dns) { -        /* if not in the cache already, put this host in the cache */ -        dns = Curl_cache_addr(data, head, hostname, port); -        if(dns) { -          dns->timestamp = 0; /* mark as added by CURLOPT_RESOLVE */ -          /* release the returned reference; the cache itself will keep the -           * entry alive: */ -          dns->inuse--; -        } -      } -      else { -        /* this is a duplicate, free it again */ -        infof(data, "RESOLVE %s:%d is already cached, %s not stored!\n", -              hostname, port, addresses); -        Curl_freeaddrinfo(head); +      /* put this new host in the cache */ +      dns = Curl_cache_addr(data, head, hostname, port); +      if(dns) { +        dns->timestamp = 0; /* mark as added by CURLOPT_RESOLVE */ +        /* release the returned reference; the cache itself will keep the +         * entry alive: */ +            dns->inuse--;        }        if(data->share)  | 
