diff options
author | Daniel Stenberg <daniel@haxx.se> | 2017-10-06 01:11:17 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2017-10-06 01:11:17 +0200 |
commit | d1451a56cf8aa1b28a45f04a03649ea64e530400 (patch) | |
tree | b9474ec89635c6e82e2d07c4424ba1765d91c31b /lib | |
parent | 7bc5308db3385cdc31efa8182b58e229eb721994 (diff) | |
download | curl-bagder/imap-no-remove_handle.tar.gz |
multi_cleanup: call DONE on handles that never got thatbagder/imap-no-remove_handle
... fixes a memory leak with at least IMAP when remove_handle is never
called and the transfer is abruptly just abandoned early.
Test 1552 added to verify
Assisted-by: Max Dymond
Diffstat (limited to 'lib')
-rw-r--r-- | lib/multi.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/lib/multi.c b/lib/multi.c index 70aa6bcf9..faf42f1fa 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -2224,6 +2224,27 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi) multi->type = 0; /* not good anymore */ + /* Firsrt remove all remaining easy handles */ + data = multi->easyp; + while(data) { + nextdata = data->next; + if(!data->state.done && data->easy_conn) + /* if DONE was never called for this handle */ + (void)multi_done(&data->easy_conn, CURLE_OK, TRUE); + if(data->dns.hostcachetype == HCACHE_MULTI) { + /* clear out the usage of the shared DNS cache */ + Curl_hostcache_clean(data, data->dns.hostcache); + data->dns.hostcache = NULL; + data->dns.hostcachetype = HCACHE_NONE; + } + + /* Clear the pointer to the connection cache */ + data->state.conn_cache = NULL; + data->multi = NULL; /* clear the association */ + + data = nextdata; + } + /* Close all the connections in the connection cache */ close_all_connections(multi); @@ -2243,24 +2264,6 @@ CURLMcode curl_multi_cleanup(struct Curl_multi *multi) Curl_llist_destroy(&multi->msglist, NULL); Curl_llist_destroy(&multi->pending, NULL); - /* remove all easy handles */ - data = multi->easyp; - while(data) { - nextdata = data->next; - if(data->dns.hostcachetype == HCACHE_MULTI) { - /* clear out the usage of the shared DNS cache */ - Curl_hostcache_clean(data, data->dns.hostcache); - data->dns.hostcache = NULL; - data->dns.hostcachetype = HCACHE_NONE; - } - - /* Clear the pointer to the connection cache */ - data->state.conn_cache = NULL; - data->multi = NULL; /* clear the association */ - - data = nextdata; - } - Curl_hash_destroy(&multi->hostcache); /* Free the blacklists by setting them to NULL */ |