Procházet zdrojové kódy

Fix EPSV for domains with multiple A entries.

We can not use the DNS name to open the data connection, as we might get
another IP than the current host from the DNS resolution.
Julien Laffaye před 10 roky
rodič
revize
b33f6e0005
1 změnil soubory, kde provedl 5 přidání a 2 odebrání
  1. 5 2
      ftp.go

+ 5 - 2
ftp.go

@@ -59,12 +59,15 @@ func Dial(addr string) (*ServerConn, error) {
 // It is generally followed by a call to Login() as most FTP commands require
 // an authenticated user.
 func DialTimeout(addr string, timeout time.Duration) (*ServerConn, error) {
-	host, _, err := net.SplitHostPort(addr)
+	tconn, err := net.DialTimeout("tcp", addr, timeout)
 	if err != nil {
 		return nil, err
 	}
 
-	tconn, err := net.DialTimeout("tcp", addr, timeout)
+	// Use the resolved IP address in case addr contains a domain name
+	// If we use the domain name, we might not resolve to the same IP.
+	remoteAddr := tconn.RemoteAddr().String()
+	host, _, err := net.SplitHostPort(remoteAddr)
 	if err != nil {
 		return nil, err
 	}