From 32c03eadd68fffb3ef8e4b7fe61b07c0fe83c4b3 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 21 Oct 2002 13:20:30 +0000 Subject: 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. --- lib/hostip.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'lib/hostip.c') 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; -- cgit v1.2.3