Commit ef19e309 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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.
parent 2d356ba1
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -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
+2 −0
Original line number Diff line number Diff line
@@ -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;