From b33f6e000553390f441b6641641af001bf78d79c Mon Sep 17 00:00:00 2001 From: Julien Laffaye Date: Tue, 18 Aug 2015 23:38:53 +0200 Subject: [PATCH] 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. --- ftp.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ftp.go b/ftp.go index 3658f23..28e53bf 100644 --- a/ftp.go +++ b/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 }