asyn-ares: make a single alloc out of hostname + async data

This saves one alloc per name resolve and simplifies the exit path.

Closes #9310
This commit is contained in:
Daniel Stenberg 2022-08-15 16:49:44 +02:00
parent 37dbbbb6c1
commit 14d9d79c87
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -115,6 +115,7 @@ struct thread_data {
#ifndef HAVE_CARES_GETADDRINFO
struct curltime happy_eyeballs_dns_time; /* when this timer started, or 0 */
#endif
char hostname[1];
};
/* How long we are willing to wait for additional parallel responses after
@ -252,8 +253,6 @@ void Curl_resolver_kill(struct Curl_easy *data)
*/
static void destroy_async_data(struct Curl_async *async)
{
free(async->hostname);
if(async->tdata) {
struct thread_data *res = async->tdata;
if(res) {
@ -265,8 +264,6 @@ static void destroy_async_data(struct Curl_async *async)
}
async->tdata = NULL;
}
async->hostname = NULL;
}
/*
@ -758,25 +755,18 @@ struct Curl_addrinfo *Curl_resolver_getaddrinfo(struct Curl_easy *data,
int port,
int *waitp)
{
char *bufp;
struct thread_data *res = NULL;
size_t namelen = strlen(hostname);
*waitp = 0; /* default to synchronous response */
bufp = strdup(hostname);
if(bufp) {
struct thread_data *res = NULL;
free(data->state.async.hostname);
data->state.async.hostname = bufp;
res = calloc(sizeof(struct thread_data) + namelen, 1);
if(res) {
strcpy(res->hostname, hostname);
data->state.async.hostname = res->hostname;
data->state.async.port = port;
data->state.async.done = FALSE; /* not done */
data->state.async.status = 0; /* clear */
data->state.async.dns = NULL; /* clear */
res = calloc(sizeof(struct thread_data), 1);
if(!res) {
free(data->state.async.hostname);
data->state.async.hostname = NULL;
return NULL;
}
data->state.async.tdata = res;
/* initial status - failed */