diff --git a/lib/hostip.c b/lib/hostip.c index bc0f4d979..f787f7051 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -631,16 +631,28 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data, &h, /* DIFFERENCE */ &h_errnop); /* Redhat 8, using glibc 2.2.93 changed the behavior. Now all of a - sudden this function seems to be setting EAGAIN if the given buffer - size is too small. Previous versions are known to return ERANGE for - the same. */ + sudden this function returns EAGAIN if the given buffer size is too + small. Previous versions are known to return ERANGE for the same + problem. + + This wouldn't be such a big problem if older versions wouldn't + sometimes return EAGAIN on a common failure case. Alas, we can't + assume that EAGAIN *or* ERANGE means ERANGE for any given version of + glibc. + + For now, we do that and thus we may call the function repeatedly and + fail for older glibc versions that return EAGAIN, until we run out + of buffer size (step_size grows beyond CURL_NAMELOOKUP_SIZE). + + If anyone has a better fix, please tell us! + */ if((ERANGE == res) || (EAGAIN == res)) { step_size+=200; continue; } break; - } while(1); + } while(step_size <= CURL_NAMELOOKUP_SIZE); if(!h) /* failure */ res=1;