From: Daniel Stenberg Date: Mon, 21 Oct 2002 13:20:30 +0000 (+0000) Subject: glibc 2.2.93 gethostbyname_r() no longer returns ERANGE if the given buffer X-Git-Tag: curl-7_10_2~48 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=32c03eadd68fffb3ef8e4b7fe61b07c0fe83c4b3;p=curl 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. --- diff --git a/lib/hostip.c b/lib/hostip.c index 42cac0501..29d395d0a 100644 --- a/lib/hostip.c +++ b/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;