diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-07-30 16:53:44 +0000 | 
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-07-30 16:53:44 +0000 | 
| commit | 6543304876c53bcc077ca236f5f45be33cb2df3d (patch) | |
| tree | bb4c2cfa36ff0d7180b5ac1c0d444a0da2587a93 | |
| parent | 1f93766a7d9b438c42faa40db419e7278a1d5ce8 (diff) | |
patch #3: make resolv.c use __uc_malloc
| -rw-r--r-- | libc/inet/resolv.c | 41 | ||||
| -rw-r--r-- | libcrypt/des.c | 1 | 
2 files changed, 30 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);  } diff --git a/libcrypt/des.c b/libcrypt/des.c index 8efd05e68..be2622ecf 100644 --- a/libcrypt/des.c +++ b/libcrypt/des.c @@ -697,6 +697,7 @@ char *__des_crypt(const unsigned char *key, const unsigned char *setting)  #define output __des_crypt_out  	if (!__uc_des_data) { +		/* If malloc returns NULL, we just segfault. Other ideas? */  		__uc_des_data = memset(__uc_malloc(sizeof(D)), 0, sizeof(D));  	}  | 
