glibc 2.2.93 gethostbyname_r() no longer returns ERANGE if the given buffer
authorDaniel Stenberg <daniel@haxx.se>
Mon, 21 Oct 2002 13:20:30 +0000 (13:20 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 21 Oct 2002 13:20:30 +0000 (13:20 +0000)
size isn't big enough. For some reason they now return EAGAIN.

Redhat 8 ships with this glibc version.

lib/hostip.c

index 42cac05..29d395d 100644 (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;