aboutsummaryrefslogtreecommitdiff
path: root/lib/hostip.c
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2008-10-10 17:25:53 +0000
committerYang Tse <yangsita@gmail.com>2008-10-10 17:25:53 +0000
commitc455254fd1f2f00be8fac1e6aa8ee32945f42248 (patch)
tree6b06fc97ab47c2a4d3f9fa44e74797da1169453d /lib/hostip.c
parentbb1f6e681830aba56db14c84512af371877f8601 (diff)
attempt to fix or allow further detection of an elusive icc SIGSEGV
Diffstat (limited to 'lib/hostip.c')
-rw-r--r--lib/hostip.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/lib/hostip.c b/lib/hostip.c
index 8d82b2e48..ce2644e7d 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -733,11 +733,10 @@ void Curl_freeaddrinfo(Curl_addrinfo *ai)
}
}
-struct namebuf {
+struct namebuf4 {
struct hostent hostentry;
- char *h_addr_list[2];
struct in_addr addrentry;
- char h_name[16]; /* 123.123.123.123 = 15 letters is maximum */
+ char *h_addr_list[2];
};
/*
@@ -760,13 +759,23 @@ Curl_addrinfo *Curl_ip2addr(in_addr_t num, const char *hostname, int port)
#pragma message disable PTRMISMATCH
#endif
- struct hostent *h;
- struct in_addr *addrentry;
- struct namebuf buffer;
- struct namebuf *buf = &buffer;
+ struct hostent *h;
+ struct in_addr *addrentry;
+ struct namebuf4 *buf;
+ char *hoststr;
+
+ DEBUGASSERT(hostname);
+
+ buf = malloc(sizeof(struct namebuf4));
+ if(!buf)
+ return NULL;
+
+ hoststr = strdup(hostname);
+ if(!hoststr) {
+ free(buf);
+ return NULL;
+ }
- h = &buf->hostentry;
- h->h_addr_list = &buf->h_addr_list[0];
addrentry = &buf->addrentry;
#ifdef _CRAYC
/* On UNICOS, s_addr is a bit field and for some reason assigning to it
@@ -776,15 +785,15 @@ Curl_addrinfo *Curl_ip2addr(in_addr_t num, const char *hostname, int port)
#else
addrentry->s_addr = num;
#endif
- h->h_addr_list[0] = (char*)addrentry;
- h->h_addr_list[1] = NULL;
- h->h_addrtype = AF_INET;
- h->h_length = sizeof(*addrentry);
- h->h_name = &buf->h_name[0];
- h->h_aliases = NULL;
- /* Now store the dotted version of the address */
- snprintf(h->h_name, 16, "%s", hostname);
+ h = &buf->hostentry;
+ h->h_name = hoststr;
+ h->h_aliases = NULL;
+ h->h_addrtype = AF_INET;
+ h->h_length = sizeof(struct in_addr);
+ h->h_addr_list = &buf->h_addr_list[0];
+ h->h_addr_list[0] = (char*)addrentry;
+ h->h_addr_list[1] = NULL; /* terminate list of entries */
#if defined(VMS) && \
defined(__INITIAL_POINTER_SIZE) && (__INITIAL_POINTER_SIZE == 64)
@@ -794,6 +803,9 @@ Curl_addrinfo *Curl_ip2addr(in_addr_t num, const char *hostname, int port)
ai = Curl_he2ai(h, port);
+ free(hoststr);
+ free(buf);
+
return ai;
}