Commit 5d9ae88f authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

getaddrinfo() cleanups

parent 9d066935
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -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;
+56 −4
Original line number Diff line number Diff line
@@ -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;
@@ -90,6 +140,8 @@ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
    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 */
+12 −0
Original line number Diff line number Diff line
@@ -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
+7 −0
Original line number Diff line number Diff line
@@ -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__)
+1 −6
Original line number Diff line number Diff line
@@ -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);