Commit 3377e692 authored by Patrick Monnerat's avatar Patrick Monnerat
Browse files

FTP: Make EPSV use the control IP address rather than the original host.

This ensures an alternate address is not used.
Does not apply to proxy tunnel.
parent 5bf472fd
Loading
Loading
Loading
Loading
+26 −14
Original line number Diff line number Diff line
@@ -1906,6 +1906,22 @@ static CURLcode proxy_magic(struct connectdata *conn,
  return result;
}

static char *control_address(struct connectdata *conn)
{
  /* Returns the control connection IP address.
     If a proxy tunnel is used, returns the original host name instead, because
     the effective control connection address is the proxy address,
     not the ftp host. */
  if(conn->bits.tunnel_proxy ||
     conn->proxytype == CURLPROXY_SOCKS5 ||
     conn->proxytype == CURLPROXY_SOCKS5_HOSTNAME ||
     conn->proxytype == CURLPROXY_SOCKS4 ||
     conn->proxytype == CURLPROXY_SOCKS4A)
    return conn->host.name;

  return conn->ip_addr_str;
}

static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
                                    int ftpcode)
{
@@ -1951,9 +1967,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
        }
        if(ptr) {
          ftpc->newport = (unsigned short)(num & 0xffff);

          /* use the original host name again */
          ftpc->newhost = strdup(conn->host.name);
          ftpc->newhost = strdup(control_address(conn));
          if(!ftpc->newhost)
            return CURLE_OUT_OF_MEMORY;
        }
@@ -2001,9 +2015,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
      infof(data, "Skip %d.%d.%d.%d for data connection, re-use %s instead\n",
            ip[0], ip[1], ip[2], ip[3],
            conn->host.name);

      /* use the original host name again */
      ftpc->newhost = strdup(conn->host.name);
      ftpc->newhost = strdup(control_address(conn));
    }
    else
      ftpc->newhost = aprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);