glibc 2.2.93 gethostbyname_r() no longer returns ERANGE if the given buffer

size isn't big enough. For some reason they now return EAGAIN.

Redhat 8 ships with this glibc version.
This commit is contained in:
Daniel Stenberg 2002-10-21 13:20:30 +00:00
parent 0fa512f26d
commit 32c03eadd6
1 changed files with 19 additions and 8 deletions

View File

@ -597,14 +597,25 @@ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
#endif
#ifdef HAVE_GETHOSTBYNAME_R_6
/* Linux */
while((res=gethostbyname_r(hostname,
(struct hostent *)buf,
(char *)buf + sizeof(struct hostent),
step_size - sizeof(struct hostent),
&h, /* DIFFERENCE */
&h_errnop))==ERANGE) {
step_size+=200;
}
do {
res=gethostbyname_r(hostname,
(struct hostent *)buf,
(char *)buf + sizeof(struct hostent),
step_size - sizeof(struct hostent),
&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. */
if((ERANGE == res) || (EAGAIN == res)) {
step_size+=200;
continue;
}
break;
} while(1);
if(!h) /* failure */
res=1;