From c455254fd1f2f00be8fac1e6aa8ee32945f42248 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Fri, 10 Oct 2008 17:25:53 +0000 Subject: [PATCH] attempt to fix or allow further detection of an elusive icc SIGSEGV --- lib/hostares.c | 45 +++++++++++++++++++++++++++------------------ lib/hostip.c | 46 +++++++++++++++++++++++++++++----------------- 2 files changed, 56 insertions(+), 35 deletions(-) diff --git a/lib/hostares.c b/lib/hostares.c index 2e5f8f734..d7dceaa1d 100644 --- a/lib/hostares.c +++ b/lib/hostares.c @@ -292,10 +292,9 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn, #ifdef ENABLE_IPV6 /* CURLRES_IPV6 */ struct namebuf6 { - struct hostent hostentry; - char *h_addr_list[2]; + struct hostent hostentry; struct in6_addr addrentry; - char hostname[1]; + char *h_addr_list[2]; }; /* @@ -312,41 +311,51 @@ Curl_addrinfo *Curl_ip2addr6(struct in6_addr *in, { Curl_addrinfo *ai; -#if defined(VMS) && defined(__INITIAL_POINTER_SIZE) && \ - (__INITIAL_POINTER_SIZE == 64) +#if defined(VMS) && \ + defined(__INITIAL_POINTER_SIZE) && (__INITIAL_POINTER_SIZE == 64) #pragma pointer_size save #pragma pointer_size short #pragma message disable PTRMISMATCH #endif - struct hostent *h; + struct hostent *h; struct in6_addr *addrentry; - struct namebuf6 *buf = malloc(sizeof (struct namebuf6) + strlen(hostname)); + struct namebuf6 *buf; + char *hoststr; + DEBUGASSERT(in && hostname); + + buf = malloc(sizeof(struct namebuf6)); if(!buf) return NULL; - h = &buf->hostentry; - h->h_addr_list = &buf->h_addr_list[0]; + hoststr = strdup(hostname); + if(!hoststr) { + free(buf); + return NULL; + } + addrentry = &buf->addrentry; - memcpy(addrentry, in, sizeof (*in)); - h->h_addr_list[0] = (char*)addrentry; - h->h_addr_list[1] = NULL; /* terminate list of entries */ - h->h_name = &buf->hostname[0]; + memcpy(addrentry, in, sizeof(struct in6_addr)); + + h = &buf->hostentry; + h->h_name = hoststr; h->h_aliases = NULL; h->h_addrtype = AF_INET6; + h->h_length = sizeof(struct in6_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 */ - /* Now store the dotted version of the address */ - strcpy (h->h_name, hostname); - -#if defined(VMS) && defined(__INITIAL_POINTER_SIZE) && \ - (__INITIAL_POINTER_SIZE == 64) +#if defined(VMS) && \ + defined(__INITIAL_POINTER_SIZE) && (__INITIAL_POINTER_SIZE == 64) #pragma pointer_size restore #pragma message enable PTRMISMATCH #endif ai = Curl_he2ai(h, port); + free(hoststr); free(buf); return ai; 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; }