Commit 248c2b9b authored by Dan Fandrich's avatar Dan Fandrich
Browse files

Eliminate a unnecessary socket creation in Curl_getaddrinfo for an IPv4

address in an IPv6 capable libcurl.
parent a8baa050
Loading
Loading
Loading
Loading
+27 −26
Original line number Diff line number Diff line
@@ -771,14 +771,29 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
  struct addrinfo hints, *res;
  int error;
  char sbuf[NI_MAXSERV];
  curl_socket_t s;
  int pf;
  struct SessionHandle *data = conn->data;

  *waitp = FALSE; /* default to synch response */

  /*
   * Check if a limited name resolve has been requested.
   */
  switch(data->set.ip_version) {
  case CURL_IPRESOLVE_V4:
    pf = PF_INET;
    break;
  case CURL_IPRESOLVE_V6:
    pf = PF_INET6;
    break;
  default:
    pf = PF_UNSPEC;
    break;
  }

  if (pf != PF_INET) {
    /* see if we have an IPv6 stack */
  s = socket(PF_INET6, SOCK_DGRAM, 0);
    curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
    if(s == CURL_SOCKET_BAD) {
      /* Some non-IPv6 stacks have been found to make very slow name resolves
       * when PF_UNSPEC is used, so thus we switch to a mere PF_INET lookup if
@@ -791,20 +806,6 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
       * possible checks. And close the socket again.
       */
      sclose(s);

    /*
     * Check if a more limited name resolve has been requested.
     */
    switch(data->set.ip_version) {
    case CURL_IPRESOLVE_V4:
      pf = PF_INET;
      break;
    case CURL_IPRESOLVE_V6:
      pf = PF_INET6;
      break;
    default:
      pf = PF_UNSPEC;
      break;
    }
  }