summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/inet/resolv.c41
-rw-r--r--libcrypt/des.c1
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));
}