mirror of
https://github.com/moparisthebest/curl
synced 2024-12-25 17:48:48 -05:00
ares: always store IPv6 addresses first
Trying dual-stack on some embedded platform, I noticed that quite frequently (20%) libCurl starts from IPv4 regardless the Happy Eyeballs timeout value. After debugging this issue, I noticed that this happens if c-ares resolver response for IPv6 family comes before IPv4 (which was randomly happening in my tests). In such cases, because libCurl puts the last resolver response on top of the address list, when IPv4 resolver response comes after IPv6 one - the IPv4 family starts the connection phase instead of IPv6 family. The solution for this issue is to always put IPv6 addresses on top of the address list, regardless the order of resolver responses. Bug: https://curl.se/mail/lib-2021-06/0003.html Closes #7188
This commit is contained in:
parent
0a51355556
commit
4bd20889fc
@ -493,17 +493,31 @@ CURLcode Curl_resolver_wait_resolv(struct Curl_easy *data,
|
|||||||
static void compound_results(struct thread_data *res,
|
static void compound_results(struct thread_data *res,
|
||||||
struct Curl_addrinfo *ai)
|
struct Curl_addrinfo *ai)
|
||||||
{
|
{
|
||||||
struct Curl_addrinfo *ai_tail;
|
|
||||||
if(!ai)
|
if(!ai)
|
||||||
return;
|
return;
|
||||||
ai_tail = ai;
|
|
||||||
|
|
||||||
|
#ifdef ENABLE_IPV6 /* CURLRES_IPV6 */
|
||||||
|
if(res->temp_ai && res->temp_ai->ai_family == PF_INET6) {
|
||||||
|
/* We have results already, put the new IPv6 entries at the head of the
|
||||||
|
list. */
|
||||||
|
struct Curl_addrinfo *temp_ai_tail = res->temp_ai;
|
||||||
|
|
||||||
|
while(temp_ai_tail->ai_next)
|
||||||
|
temp_ai_tail = temp_ai_tail->ai_next;
|
||||||
|
|
||||||
|
temp_ai_tail->ai_next = ai;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* CURLRES_IPV6 */
|
||||||
|
{
|
||||||
|
/* Add the new results to the list of old results. */
|
||||||
|
struct Curl_addrinfo *ai_tail = ai;
|
||||||
while(ai_tail->ai_next)
|
while(ai_tail->ai_next)
|
||||||
ai_tail = ai_tail->ai_next;
|
ai_tail = ai_tail->ai_next;
|
||||||
|
|
||||||
/* Add the new results to the list of old results. */
|
|
||||||
ai_tail->ai_next = res->temp_ai;
|
ai_tail->ai_next = res->temp_ai;
|
||||||
res->temp_ai = ai;
|
res->temp_ai = ai;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user