diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/hostip4.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/hostip4.c b/lib/hostip4.c index 76f75181e..f380d3ef8 100644 --- a/lib/hostip4.c +++ b/lib/hostip4.c @@ -196,6 +196,8 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,    struct hostent *h = NULL;    in_addr_t in;    struct SessionHandle *data = conn->data; +  struct hostent *buf = NULL; +    (void)port; /* unused in IPv4 code */    *waitp = 0; /* don't wait, we act synchronously */ @@ -215,7 +217,8 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,    else {      int h_errnop;      int res=ERANGE; -    int *buf = (int *)calloc(CURL_HOSTENT_SIZE, 1); + +    buf = (struct hostent *)calloc(CURL_HOSTENT_SIZE, 1);      if(!buf)        return NULL; /* major failure */      /* @@ -326,7 +329,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,      if(!res) { /* success */ -      h = (struct hostent*)buf; /* result expected in h */ +      h = buf; /* result expected in h */        /* This is the worst kind of the different gethostbyname_r() interfaces.         * Since we don't know how big buffer this particular lookup required, @@ -359,7 +362,8 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,    if(h) {      ai = Curl_he2ai(h, port); -    free(h); +    if (h == buf) /* used a *_r() function */ +      free(h);    }    return ai;  | 
