Index: Lib/ftplib.py =================================================================== --- Lib/ftplib.py (revisione 88734) +++ Lib/ftplib.py (copia locale) @@ -291,7 +291,10 @@ '''Create a new socket and send a PORT command for it.''' msg = "getaddrinfo returns an empty list" sock = None - for res in socket.getaddrinfo(None, 0, self.af, socket.SOCK_STREAM, 0, socket.AI_PASSIVE): + # bind to the same local address used for the control connection + myaddr = self.sock.getsockname()[0] + for res in socket.getaddrinfo(myaddr, 0, self.af, socket.SOCK_STREAM, 0, + socket.AI_PASSIVE): af, socktype, proto, canonname, sa = res try: sock = socket.socket(af, socktype, proto) @@ -340,8 +343,11 @@ size = None if self.passiveserver: host, port = self.makepasv() + # bind to the same local address used for the control + # connection + sa = (self.sock.getsockname()[0], 0) conn = socket.create_connection((host, port), self.timeout, - source_address=self.source_address) + source_address=sa) if rest is not None: self.sendcmd("REST %s" % rest) resp = self.sendcmd(cmd) Index: Lib/test/test_ftplib.py =================================================================== --- Lib/test/test_ftplib.py (revisione 88734) +++ Lib/test/test_ftplib.py (copia locale) @@ -616,12 +616,6 @@ self.assertEqual(self.client.sock.getsockname()[1], port) self.client.quit() - def test_source_address_passive_connection(self): - port = support.find_unused_port() - self.client.source_address = (HOST, port) - sock = self.client.transfercmd('list') - self.assertEqual(sock.getsockname()[1], port) - def test_parse257(self): self.assertEqual(ftplib.parse257('257 "/foo/bar"'), '/foo/bar') self.assertEqual(ftplib.parse257('257 "/foo/bar" created'), '/foo/bar')