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: upstream/7.37.1~15167 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=32c03eadd68fffb3ef8e4b7fe61b07c0fe83c4b3;p=platform%2Fupstream%2Fcurl.git 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 42cac05..29d395d 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;