aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2011-01-27 14:37:25 +0100
committerDaniel Stenberg <daniel@haxx.se>2011-01-27 14:41:07 +0100
commitef19e30985fabbe6f5abecf623f371450488653c (patch)
tree62857b4ed6125c787a066a7b16fb00a071df8c58
parent2d356ba1683d47ebbd08e9d6e4bb4acbb8729fee (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.c19
-rw-r--r--lib/url.c2
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
diff --git a/lib/url.c b/lib/url.c
index cd89e1f89..c07554182 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -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;