aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/hostip.c20
1 files changed, 16 insertions, 4 deletions
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;