diff options
author | Daniel Stenberg <daniel@haxx.se> | 2012-11-18 16:17:37 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2012-11-18 16:39:31 +0100 |
commit | 409f2a041f752ef635354e1dc7b2759fcd7088d6 (patch) | |
tree | ba6516576b5a6692398374cedddf16000fa1100d /lib | |
parent | dd75cba3ef1a9e6ddaae9d62080713101403af1c (diff) |
fixed memory leak: CURLOPT_RESOLVE with multi interface
DNS cache entries populated with CURLOPT_RESOLVE were not properly freed
again when done using the multi interface.
Test case 1502 added to verify.
Bug: http://curl.haxx.se/bug/view.cgi?id=3575448
Reported by: Alex Gruz
Diffstat (limited to 'lib')
-rw-r--r-- | lib/hostip.c | 8 | ||||
-rw-r--r-- | lib/hostip.h | 10 | ||||
-rw-r--r-- | lib/multi.c | 13 |
3 files changed, 19 insertions, 12 deletions
diff --git a/lib/hostip.c b/lib/hostip.c index 503ba483f..ef14ce863 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -740,14 +740,18 @@ static int hostcache_inuse(void *data, void *hc) return 1; /* free all entries */ } -void Curl_hostcache_destroy(struct SessionHandle *data) +void Curl_hostcache_clean(struct SessionHandle *data) { /* Entries added to the hostcache with the CURLOPT_RESOLVE function are * still present in the cache with the inuse counter set to 1. Detect them * and cleanup! */ Curl_hash_clean_with_criterium(data->dns.hostcache, data, hostcache_inuse); +} +void Curl_hostcache_destroy(struct SessionHandle *data) +{ + Curl_hostcache_clean(data); Curl_hash_destroy(data->dns.hostcache); data->dns.hostcachetype = HCACHE_NONE; data->dns.hostcache = NULL; diff --git a/lib/hostip.h b/lib/hostip.h index 12fb80f54..de71f54f4 100644 --- a/lib/hostip.h +++ b/lib/hostip.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -201,10 +201,18 @@ extern sigjmp_buf curl_jmpenv; CURLcode Curl_set_dns_servers(struct SessionHandle *data, char *servers); /* + * Clean off entries from the cache + */ +void Curl_hostcache_clean(struct SessionHandle *data); + +/* * Destroy the hostcache of this handle. */ void Curl_hostcache_destroy(struct SessionHandle *data); +/* + * Populate the cache with specified entries from CURLOPT_RESOLVE. + */ CURLcode Curl_loadhostpairs(struct SessionHandle *data); #endif /* HEADER_CURL_HOSTIP_H */ diff --git a/lib/multi.c b/lib/multi.c index 938846769..b4e01bd93 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -1789,12 +1789,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, } WHILE_FALSE; /* just to break out from! */ if(CURLM_STATE_COMPLETED == easy->state) { - if(data->dns.hostcachetype == HCACHE_MULTI) { - /* clear out the usage of the shared DNS cache */ - data->dns.hostcache = NULL; - data->dns.hostcachetype = HCACHE_NONE; - } - /* now fill in the Curl_message with this info */ msg = &easy->msg; @@ -1911,9 +1905,6 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle) cl= n; } - Curl_hash_destroy(multi->hostcache); - multi->hostcache = NULL; - Curl_hash_destroy(multi->sockhash); multi->sockhash = NULL; @@ -1930,6 +1921,7 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle) nexteasy=easy->next; if(easy->easy_handle->dns.hostcachetype == HCACHE_MULTI) { /* clear out the usage of the shared DNS cache */ + Curl_hostcache_clean(easy->easy_handle); easy->easy_handle->dns.hostcache = NULL; easy->easy_handle->dns.hostcachetype = HCACHE_NONE; } @@ -1943,6 +1935,9 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle) easy = nexteasy; } + Curl_hash_destroy(multi->hostcache); + multi->hostcache = NULL; + free(multi); return CURLM_OK; |