diff options
| -rw-r--r-- | lib/hostares.c | 43 | ||||
| -rw-r--r-- | lib/hostip.c | 46 | 
2 files changed, 55 insertions, 34 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; +  hoststr = strdup(hostname); +  if(!hoststr) { +    free(buf); +    return NULL; +  } + +  addrentry = &buf->addrentry; +  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]; -  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]; -  h->h_aliases = NULL; -  h->h_addrtype = AF_INET6; - -  /* 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;  } | 
