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:
		
							
								
								
									
										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; | ||||
|      | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Daniel Stenberg
					Daniel Stenberg