ares: memory leak fix
authorDaniel Stenberg <daniel@haxx.se>
Thu, 27 Jan 2011 13:37:25 +0000 (14:37 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 27 Jan 2011 13:41:07 +0000 (14:41 +0100)
The double name resolve trick used with c-ares could leave allocated
memory in 'temp_ai' if the operation was aborted in the middle.

lib/hostasyn.c
lib/url.c

index 7a65cb1..710ff50 100644 (file)
@@ -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
index cd89e1f..c075541 100644 (file)
--- 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;