aboutsummaryrefslogtreecommitdiff
path: root/lib/hostip.c
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2008-10-13 06:23:42 +0000
committerYang Tse <yangsita@gmail.com>2008-10-13 06:23:42 +0000
commitd6114165d3a8a57cdf1b2d1039ceff4a4d468663 (patch)
tree892eac0929f4443760f685eac6082ff14b245a99 /lib/hostip.c
parentc3a959cc37d69f2634fa3b6a0a4775c7cf08ce27 (diff)
attempt to fix or allow further detection of an elusive icc SIGSEGV
Diffstat (limited to 'lib/hostip.c')
-rw-r--r--lib/hostip.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/lib/hostip.c b/lib/hostip.c
index ce2644e7d..2fd99ef9f 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -726,6 +726,8 @@ void Curl_freeaddrinfo(Curl_addrinfo *ai)
/* walk over the list and free all entries */
while(ai) {
next = ai->ai_next;
+ if(ai->ai_addr)
+ free(ai->ai_addr);
if(ai->ai_canonname)
free(ai->ai_canonname);
free(ai);
@@ -851,14 +853,15 @@ Curl_addrinfo *Curl_he2ai(const struct hostent *he, int port)
#ifdef CURLRES_IPV6
struct sockaddr_in6 *addr6;
#endif /* CURLRES_IPV6 */
+ CURLcode result = CURLE_OK;
int i;
- struct in_addr *curr;
+ char *curr;
if(!he)
/* no input == no output! */
return NULL;
- for(i=0; (curr = (struct in_addr *)he->h_addr_list[i]) != NULL; i++) {
+ for(i=0; (curr = he->h_addr_list[i]) != NULL; i++) {
int ss_size;
#ifdef CURLRES_IPV6
@@ -868,10 +871,21 @@ Curl_addrinfo *Curl_he2ai(const struct hostent *he, int port)
#endif /* CURLRES_IPV6 */
ss_size = sizeof (struct sockaddr_in);
- ai = calloc(1, sizeof(Curl_addrinfo) + ss_size);
-
- if(!ai)
+ if((ai = calloc(1, sizeof(Curl_addrinfo))) == NULL) {
+ result = CURLE_OUT_OF_MEMORY;
+ break;
+ }
+ if((ai->ai_canonname = strdup(he->h_name)) == NULL) {
+ result = CURLE_OUT_OF_MEMORY;
+ free(ai);
+ break;
+ }
+ if((ai->ai_addr = calloc(1, ss_size)) == NULL) {
+ result = CURLE_OUT_OF_MEMORY;
+ free(ai->ai_canonname);
+ free(ai);
break;
+ }
if(!firstai)
/* store the pointer we want to return from this function */
@@ -888,12 +902,6 @@ Curl_addrinfo *Curl_he2ai(const struct hostent *he, int port)
ai->ai_socktype = SOCK_STREAM;
ai->ai_addrlen = ss_size;
- /* make the ai_addr point to the address immediately following this struct
- and use that area to store the address */
- ai->ai_addr = (struct sockaddr *) ((char*)ai + sizeof(Curl_addrinfo));
-
- /* need to free this eventually */
- ai->ai_canonname = strdup(he->h_name);
/* leave the rest of the struct filled with zero */
@@ -901,7 +909,7 @@ Curl_addrinfo *Curl_he2ai(const struct hostent *he, int port)
case AF_INET:
addr = (struct sockaddr_in *)ai->ai_addr; /* storage area for this info */
- memcpy((char *)&(addr->sin_addr), curr, sizeof(struct in_addr));
+ memcpy(&addr->sin_addr, curr, sizeof(struct in_addr));
addr->sin_family = (unsigned short)(he->h_addrtype);
addr->sin_port = htons((unsigned short)port);
break;
@@ -910,7 +918,7 @@ Curl_addrinfo *Curl_he2ai(const struct hostent *he, int port)
case AF_INET6:
addr6 = (struct sockaddr_in6 *)ai->ai_addr; /* storage area for this info */
- memcpy((char *)&(addr6->sin6_addr), curr, sizeof(struct in6_addr));
+ memcpy(&addr6->sin6_addr, curr, sizeof(struct in6_addr));
addr6->sin6_family = (unsigned short)(he->h_addrtype);
addr6->sin6_port = htons((unsigned short)port);
break;
@@ -919,6 +927,10 @@ Curl_addrinfo *Curl_he2ai(const struct hostent *he, int port)
prevai = ai;
}
+
+ if(result != CURLE_OK)
+ Curl_freeaddrinfo(firstai);
+
return firstai;
}