From 07e23fe051f4e92acce40504eb92920a3e921838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Gul=C3=A1csi?= Date: Wed, 17 Aug 2022 18:53:01 +0200 Subject: [PATCH] Use net.IP instead of netip.Addr --- ftp.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/ftp.go b/ftp.go index 146a8fc..fb9e2bd 100644 --- a/ftp.go +++ b/ftp.go @@ -10,7 +10,6 @@ import ( "errors" "io" "net" - "net/netip" "net/textproto" "strconv" "strings" @@ -500,12 +499,9 @@ func (c *ServerConn) pasv() (host string, port int, err error) { host = strings.Join(pasvData[0:4], ".") if c.host != host { - if cmdIP, err := netip.ParseAddr(c.host); err == nil { - if dataIP, err := netip.ParseAddr(host); err == nil { - // Logic stolen from lftp (https://github.com/lavv17/lftp/blob/d67fc14d085849a6b0418bb3e912fea2e94c18d1/src/ftpclass.cc#L769) - if dataIP.IsMulticast() || - cmdIP.IsPrivate() != dataIP.IsPrivate() || - cmdIP.IsLoopback() != dataIP.IsLoopback() { + if cmdIP := net.ParseIP(c.host); cmdIP != nil { + if dataIP := net.ParseIP(host); dataIP != nil { + if isBogusDataIP(cmdIP, dataIP) { return c.host, port, nil } } @@ -514,6 +510,13 @@ func (c *ServerConn) pasv() (host string, port int, err error) { return host, port, nil } +func isBogusDataIP(cmdIP, dataIP net.IP) bool { + // Logic stolen from lftp (https://github.com/lavv17/lftp/blob/d67fc14d085849a6b0418bb3e912fea2e94c18d1/src/ftpclass.cc#L769) + return dataIP.IsMulticast() || + cmdIP.IsPrivate() != dataIP.IsPrivate() || + cmdIP.IsLoopback() != dataIP.IsLoopback() +} + // getDataConnPort returns a host, port for a new data connection // it uses the best available method to do so func (c *ServerConn) getDataConnPort() (string, int, error) {