mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
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:
parent
0fa512f26d
commit
32c03eadd6
27
lib/hostip.c
27
lib/hostip.c
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user