diff options
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/inet/resolv.c | 41 | 
1 files changed, 29 insertions, 12 deletions
diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c index f4e6cac4f..5d3e2d871 100644 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -146,6 +146,7 @@  #include <netinet/in.h>  #include <arpa/inet.h>  #include <stdlib.h> +#include <malloc.h>  #include <unistd.h>  #include <resolv.h>  #include <netdb.h> @@ -1122,13 +1123,17 @@ void attribute_hidden __close_nameservers(void)  struct hostent *gethostbyname(const char *name)  { -	static struct hostent h; -	static char buf[sizeof(struct in_addr) + +	static struct { +		struct hostent h; +		char buf[sizeof(struct in_addr) +  					sizeof(struct in_addr *)*2 +  					sizeof(char *)*(ALIAS_DIM) + 384/*namebuffer*/ + 32/* margin */]; +	} *sp;  	struct hostent *hp; -	gethostbyname_r(name, &h, buf, sizeof(buf), &hp, &h_errno); +	free(sp); +	sp = __uc_malloc(sizeof(*sp)); +	gethostbyname_r(name, &sp->h, sp->buf, sizeof(sp->buf), &hp, &h_errno);  	return hp;  } @@ -1142,13 +1147,17 @@ struct hostent *gethostbyname2(const char *name, int family)  #ifndef __UCLIBC_HAS_IPV6__  	return family == AF_INET ? gethostbyname(name) : (struct hostent*)0;  #else /* __UCLIBC_HAS_IPV6__ */ -	static struct hostent h; -	static char buf[sizeof(struct in6_addr) + +	static struct { +		struct hostent h; +		char buf[sizeof(struct in6_addr) +  					sizeof(struct in6_addr *)*2 +  					sizeof(char *)*(ALIAS_DIM) + 384/*namebuffer*/ + 32/* margin */]; +	} *sp;  	struct hostent *hp; -	gethostbyname2_r(name, family, &h, buf, sizeof(buf), &hp, &h_errno); +	free(sp); +	sp = __uc_malloc(sizeof(*sp)); +	gethostbyname2_r(name, family, &sp->h, sp->buf, sizeof(sp->buf), &hp, &h_errno);  	return hp;  #endif /* __UCLIBC_HAS_IPV6__ */ @@ -1496,17 +1505,21 @@ libc_hidden_def(res_querydomain)  #ifdef L_gethostbyaddr  struct hostent *gethostbyaddr (const void *addr, socklen_t len, int type)  { -	static struct hostent h; -	static char buf[ +	static struct { +		struct hostent h; +		char buf[  #ifndef __UCLIBC_HAS_IPV6__  					sizeof(struct in_addr) + sizeof(struct in_addr *)*2 +  #else  					sizeof(struct in6_addr) + sizeof(struct in6_addr *)*2 +  #endif /* __UCLIBC_HAS_IPV6__ */  					sizeof(char *)*(ALIAS_DIM) + 384/*namebuffer*/ + 32/* margin */]; +	} *sp;  	struct hostent *hp; -	gethostbyaddr_r(addr, len, type, &h, buf, sizeof(buf), &hp, &h_errno); +	free(sp); +	sp = __uc_malloc(sizeof(*sp)); +	gethostbyaddr_r(addr, len, type, &sp->h, sp->buf, sizeof(sp->buf), &hp, &h_errno);  	return hp;  } @@ -1725,8 +1738,9 @@ libc_hidden_def(gethostent_r)  struct hostent *gethostent (void)  { -    static struct hostent h; -    static char buf[ +    static struct { +	struct hostent h; +	char buf[  #ifndef __UCLIBC_HAS_IPV6__  					sizeof(struct in_addr) + sizeof(struct in_addr *)*2 +  #else @@ -1734,10 +1748,13 @@ struct hostent *gethostent (void)  #endif /* __UCLIBC_HAS_IPV6__ */  					sizeof(char *)*(ALIAS_DIM) +  					80/*namebuffer*/ + 2/* margin */]; +    } *sp;      struct hostent *host; +    free(sp); +    sp = __uc_malloc(sizeof(*sp));      __UCLIBC_MUTEX_LOCK(mylock); -    gethostent_r(&h, buf, sizeof(buf), &host, &h_errno); +    gethostent_r(&sp->h, sp->buf, sizeof(sp->buf), &host, &h_errno);      __UCLIBC_MUTEX_UNLOCK(mylock);      return(host);  }  | 
