diff options
-rw-r--r-- | lib/ftp.c | 11 | ||||
-rw-r--r-- | lib/hostip.c | 60 | ||||
-rw-r--r-- | lib/hostip.h | 12 | ||||
-rw-r--r-- | lib/memdebug.h | 7 | ||||
-rw-r--r-- | lib/url.c | 7 |
5 files changed, 81 insertions, 16 deletions
@@ -906,7 +906,8 @@ CURLcode ftp_use_port(struct connectdata *conn) 2.1.X doesn't do*/ hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; - if (getaddrinfo(hbuf, "0", &hints, &res)) + + if (getaddrinfo(hbuf, (char *)"0", &hints, &res)) return CURLE_FTP_PORT_FAILED; portsock = -1; @@ -929,16 +930,15 @@ CURLcode ftp_use_port(struct connectdata *conn) break; } + freeaddrinfo(res); if (portsock < 0) { failf(data, strerror(errno)); - freeaddrinfo(res); return CURLE_FTP_PORT_FAILED; } sslen = sizeof(ss); if (getsockname(portsock, sa, &sslen) < 0) { failf(data, strerror(errno)); - freeaddrinfo(res); return CURLE_FTP_PORT_FAILED; } @@ -1047,7 +1047,6 @@ CURLcode ftp_use_port(struct connectdata *conn) if (!*modep) { sclose(portsock); - freeaddrinfo(res); return CURLE_FTP_PORT_FAILED; } /* we set the secondary socket variable to this for now, it @@ -1134,7 +1133,7 @@ CURLcode ftp_use_port(struct connectdata *conn) } if(hostdataptr) /* free the memory used for name lookup */ - free(hostdataptr); + Curl_freeaddrinfo(hostdataptr); } else { failf(data, "could't find my own IP address (%s)", myhost); @@ -1285,7 +1284,7 @@ CURLcode ftp_use_pasv(struct connectdata *conn) ftp_pasv_verbose(conn, conninfo, newhost, connectport); if(hostdataptr) - free(hostdataptr); + Curl_freeaddrinfo(hostdataptr); if(CURLE_OK != result) return result; diff --git a/lib/hostip.c b/lib/hostip.c index 4fb25bd47..5bea046b5 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al. * * In order to be useful for every potential user, curl and libcurl are * dual-licensed under the MPL and the MIT/X-derivate licenses. @@ -69,6 +69,58 @@ /* --- resolve name or IP-number --- */ #ifdef ENABLE_IPV6 + +#ifdef MALLOCDEBUG +/* These two are strictly for memory tracing and are using the same + * style as the family otherwise present in memdebug.c. I put these ones + * here since they require a bunch of struct types I didn't wanna include + * in memdebug.c + */ +int curl_getaddrinfo(char *hostname, char *service, + struct addrinfo *hints, + struct addrinfo **result, + int line, const char *source) +{ + int res=(getaddrinfo)(hostname, service, hints, result); + if(0 == res) + /* success */ + fprintf(logfile?logfile:stderr, "ADDR %s:%d getaddrinfo() = %p\n", + source, line, *result); + else + fprintf(logfile?logfile:stderr, "ADDR %s:%d getaddrinfo() failed\n", + source, line); + return res; +} +void curl_freeaddrinfo(struct addrinfo *freethis, + int line, const char *source) +{ + (freeaddrinfo)(freethis); + fprintf(logfile?logfile:stderr, "ADDR %s:%d freeaddrinfo(%p)\n", + source, line, freethis); +} + +#endif + +/* + * This is a wrapper function for freeing name information in a protocol + * independent way. This takes care of using the appropriate underlaying + * proper function. + */ +void Curl_freeaddrinfo(void *freethis) +{ +#ifdef ENABLE_IPV6 + freeaddrinfo(freethis); +#else + free(freethis); +#endif +} + +/* + * Return name information about the given hostname and port number. If + * successful, the 'addrinfo' is returned and the forth argument will point to + * memory we need to free after use. That meory *MUST* be freed with + * Curl_freeaddrinfo(), nothing else. + */ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data, char *hostname, int port, @@ -78,8 +130,6 @@ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data, int error; char sbuf[NI_MAXSERV]; - *bufp=NULL; /* pointer unused with IPv6 */ - memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; @@ -87,9 +137,11 @@ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data, snprintf(sbuf, sizeof(sbuf), "%d", port); error = getaddrinfo(hostname, sbuf, &hints, &res); if (error) { - infof(data, "getaddrinfo(3) failed for %s\n", hostname); + infof(data, "getaddrinfo(3) failed for %s\n", hostname); return NULL; } + *bufp=(char *)res; /* make it point to the result struct */ + return res; } #else /* following code is IPv4-only */ diff --git a/lib/hostip.h b/lib/hostip.h index 86272b30e..291b9cc71 100644 --- a/lib/hostip.h +++ b/lib/hostip.h @@ -27,9 +27,21 @@ struct addrinfo; struct hostent; struct SessionHandle; +/* Get name info */ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data, char *hostname, int port, char **bufp); +/* free name info */ +void Curl_freeaddrinfo(void *freethis); + +#ifdef MALLOCDEBUG +void curl_freeaddrinfo(struct addrinfo *freethis, + int line, const char *source); +int curl_getaddrinfo(char *hostname, char *service, + struct addrinfo *hints, + struct addrinfo **result, + int line, const char *source); +#endif #endif diff --git a/lib/memdebug.h b/lib/memdebug.h index 2a6a35ac2..ebb240928 100644 --- a/lib/memdebug.h +++ b/lib/memdebug.h @@ -6,6 +6,8 @@ #include <memory.h> #endif +extern FILE *logfile; + /* memory functions */ void *curl_domalloc(size_t size, int line, const char *source); void *curl_dorealloc(void *ptr, size_t size, int line, const char *source); @@ -35,6 +37,11 @@ int curl_fclose(FILE *file, int line, const char *source); #define accept(sock,addr,len)\ curl_accept(sock,addr,len,__LINE__,__FILE__) +#define getaddrinfo(host,serv,hint,res) \ + curl_getaddrinfo(host,serv,hint,res,__LINE__,__FILE__) +#define freeaddrinfo(data) \ + curl_freeaddrinfo(data,__LINE__,__FILE__) + /* sclose is probably already defined, redefine it! */ #undef sclose #define sclose(sockfd) curl_sclose(sockfd,__LINE__,__FILE__) @@ -879,13 +879,8 @@ CURLcode Curl_disconnect(struct connectdata *conn) if(conn->proto.generic) free(conn->proto.generic); -#ifdef ENABLE_IPV6 - if(conn->hostaddr) /* host name info */ - freeaddrinfo(conn->hostaddr); -#else if(conn->hostent_buf) /* host name info */ - free(conn->hostent_buf); -#endif + Curl_freeaddrinfo(conn->hostent_buf); if(conn->newurl) free(conn->newurl); |