diff options
author | Daniel Stenberg <daniel@haxx.se> | 2011-01-27 14:37:25 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2011-01-27 14:41:07 +0100 |
commit | ef19e30985fabbe6f5abecf623f371450488653c (patch) | |
tree | 62857b4ed6125c787a066a7b16fb00a071df8c58 | |
parent | 2d356ba1683d47ebbd08e9d6e4bb4acbb8729fee (diff) |
ares: memory leak fix
The double name resolve trick used with c-ares could leave allocated
memory in 'temp_ai' if the operation was aborted in the middle.
-rw-r--r-- | lib/hostasyn.c | 19 | ||||
-rw-r--r-- | lib/url.c | 2 |
2 files changed, 14 insertions, 7 deletions
diff --git a/lib/hostasyn.c b/lib/hostasyn.c index 7a65cb1b8..710ff50b7 100644 --- a/lib/hostasyn.c +++ b/lib/hostasyn.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2011, 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 @@ -83,10 +83,6 @@ void Curl_async_cancel(struct connectdata *conn) Curl_freeaddrinfo(conn->async.temp_ai); conn->async.temp_ai = NULL; } - - /* for ares-using, make sure all possible outstanding requests are properly - cancelled before we proceed */ - ares_cancel(conn->data->state.areschannel); } @@ -126,6 +122,10 @@ CURLcode Curl_addrinfo_callback(struct connectdata *conn, if(--conn->async.num_pending > 0) /* We are not done yet. Just return. */ return CURLE_OK; + + /* make sure the temp pointer is cleared and isn't pointing to something + we take care of below */ + conn->async.temp_ai = NULL; #endif if(data->share) Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE); @@ -147,8 +147,10 @@ CURLcode Curl_addrinfo_callback(struct connectdata *conn, if(--conn->async.num_pending > 0) { /* We are not done yet. Clean up and return. This function will be called again. */ - if(conn->async.temp_ai) + if(conn->async.temp_ai) { Curl_freeaddrinfo(conn->async.temp_ai); + conn->async.temp_ai = NULL; + } return CURLE_OUT_OF_MEMORY; } #endif @@ -178,9 +180,12 @@ CURLcode Curl_addrinfo_callback(struct connectdata *conn, Curl_freeaddrinfo(conn->async.temp_ai); rc = CURLE_OUT_OF_MEMORY; } - if(data->share) Curl_share_unlock(data, CURL_LOCK_DATA_DNS); + + /* make sure the temp pointer is cleared and isn't pointing to + something we've taken care of already */ + conn->async.temp_ai = NULL; } } #endif @@ -5241,6 +5241,8 @@ CURLcode Curl_done(struct connectdata **connp, data->req.location = NULL; } + Curl_async_cancel(conn); + if(conn->dns_entry) { Curl_resolv_unlock(data, conn->dns_entry); /* done with this */ conn->dns_entry = NULL; |