mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
getaddrinfo() cleanups
This commit is contained in:
parent
9d066935e5
commit
5d9ae88f58
11
lib/ftp.c
11
lib/ftp.c
@ -906,7 +906,8 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
2.1.X doesn't do*/
|
2.1.X doesn't do*/
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
hints.ai_flags = AI_PASSIVE;
|
hints.ai_flags = AI_PASSIVE;
|
||||||
if (getaddrinfo(hbuf, "0", &hints, &res))
|
|
||||||
|
if (getaddrinfo(hbuf, (char *)"0", &hints, &res))
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
|
|
||||||
portsock = -1;
|
portsock = -1;
|
||||||
@ -929,16 +930,15 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
freeaddrinfo(res);
|
||||||
if (portsock < 0) {
|
if (portsock < 0) {
|
||||||
failf(data, strerror(errno));
|
failf(data, strerror(errno));
|
||||||
freeaddrinfo(res);
|
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
sslen = sizeof(ss);
|
sslen = sizeof(ss);
|
||||||
if (getsockname(portsock, sa, &sslen) < 0) {
|
if (getsockname(portsock, sa, &sslen) < 0) {
|
||||||
failf(data, strerror(errno));
|
failf(data, strerror(errno));
|
||||||
freeaddrinfo(res);
|
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1047,7 +1047,6 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
|
|
||||||
if (!*modep) {
|
if (!*modep) {
|
||||||
sclose(portsock);
|
sclose(portsock);
|
||||||
freeaddrinfo(res);
|
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
/* we set the secondary socket variable to this for now, it
|
/* we set the secondary socket variable to this for now, it
|
||||||
@ -1134,7 +1133,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
if(hostdataptr)
|
if(hostdataptr)
|
||||||
/* free the memory used for name lookup */
|
/* free the memory used for name lookup */
|
||||||
free(hostdataptr);
|
Curl_freeaddrinfo(hostdataptr);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
failf(data, "could't find my own IP address (%s)", myhost);
|
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);
|
ftp_pasv_verbose(conn, conninfo, newhost, connectport);
|
||||||
|
|
||||||
if(hostdataptr)
|
if(hostdataptr)
|
||||||
free(hostdataptr);
|
Curl_freeaddrinfo(hostdataptr);
|
||||||
|
|
||||||
if(CURLE_OK != result)
|
if(CURLE_OK != result)
|
||||||
return result;
|
return result;
|
||||||
|
60
lib/hostip.c
60
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
|
* In order to be useful for every potential user, curl and libcurl are
|
||||||
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
||||||
@ -69,6 +69,58 @@
|
|||||||
/* --- resolve name or IP-number --- */
|
/* --- resolve name or IP-number --- */
|
||||||
|
|
||||||
#ifdef ENABLE_IPV6
|
#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,
|
Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
||||||
char *hostname,
|
char *hostname,
|
||||||
int port,
|
int port,
|
||||||
@ -78,8 +130,6 @@ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
|||||||
int error;
|
int error;
|
||||||
char sbuf[NI_MAXSERV];
|
char sbuf[NI_MAXSERV];
|
||||||
|
|
||||||
*bufp=NULL; /* pointer unused with IPv6 */
|
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(hints));
|
memset(&hints, 0, sizeof(hints));
|
||||||
hints.ai_family = PF_UNSPEC;
|
hints.ai_family = PF_UNSPEC;
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
@ -87,9 +137,11 @@ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
|||||||
snprintf(sbuf, sizeof(sbuf), "%d", port);
|
snprintf(sbuf, sizeof(sbuf), "%d", port);
|
||||||
error = getaddrinfo(hostname, sbuf, &hints, &res);
|
error = getaddrinfo(hostname, sbuf, &hints, &res);
|
||||||
if (error) {
|
if (error) {
|
||||||
infof(data, "getaddrinfo(3) failed for %s\n", hostname);
|
infof(data, "getaddrinfo(3) failed for %s\n", hostname);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
*bufp=(char *)res; /* make it point to the result struct */
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
#else /* following code is IPv4-only */
|
#else /* following code is IPv4-only */
|
||||||
|
12
lib/hostip.h
12
lib/hostip.h
@ -27,9 +27,21 @@ struct addrinfo;
|
|||||||
struct hostent;
|
struct hostent;
|
||||||
struct SessionHandle;
|
struct SessionHandle;
|
||||||
|
|
||||||
|
/* Get name info */
|
||||||
Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
||||||
char *hostname,
|
char *hostname,
|
||||||
int port,
|
int port,
|
||||||
char **bufp);
|
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
|
#endif
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern FILE *logfile;
|
||||||
|
|
||||||
/* memory functions */
|
/* memory functions */
|
||||||
void *curl_domalloc(size_t size, int line, const char *source);
|
void *curl_domalloc(size_t size, int line, const char *source);
|
||||||
void *curl_dorealloc(void *ptr, 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)\
|
#define accept(sock,addr,len)\
|
||||||
curl_accept(sock,addr,len,__LINE__,__FILE__)
|
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! */
|
/* sclose is probably already defined, redefine it! */
|
||||||
#undef sclose
|
#undef sclose
|
||||||
#define sclose(sockfd) curl_sclose(sockfd,__LINE__,__FILE__)
|
#define sclose(sockfd) curl_sclose(sockfd,__LINE__,__FILE__)
|
||||||
|
@ -879,13 +879,8 @@ CURLcode Curl_disconnect(struct connectdata *conn)
|
|||||||
if(conn->proto.generic)
|
if(conn->proto.generic)
|
||||||
free(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 */
|
if(conn->hostent_buf) /* host name info */
|
||||||
free(conn->hostent_buf);
|
Curl_freeaddrinfo(conn->hostent_buf);
|
||||||
#endif
|
|
||||||
|
|
||||||
if(conn->newurl)
|
if(conn->newurl)
|
||||||
free(conn->newurl);
|
free(conn->newurl);
|
||||||
|
Loading…
Reference in New Issue
Block a user