diff -r 74aeb4741e3d -r 22f8c33b0690 jdk/src/share/classes/sun/net/ftp/impl/FtpClient.java --- a/jdk/src/share/classes/sun/net/ftp/impl/FtpClient.java Thu Mar 28 06:55:42 2013 -0400 +++ b/jdk/src/share/classes/sun/net/ftp/impl/FtpClient.java Thu Mar 28 14:34:18 2013 -0700 @@ -76,7 +76,10 @@ private FtpReplyCode lastReplyCode = null; /** Welcome message from the server, if any. */ private String welcomeMsg; - private boolean passiveMode = true; + /** + * Only passive mode used in JDK. See Bug 8010784. + */ + private final boolean passiveMode = true; private TransferType type = TransferType.BINARY; private long restartOffset = 0; private long lastTransSize = -1; // -1 means 'unknown size' @@ -645,9 +648,18 @@ } else { s = new Socket(); } + + InetAddress serverAddress = AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public InetAddress run() { + return server.getLocalAddress(); + } + }); + // Bind the socket to the same address as the control channel. This // is needed in case of multi-homed systems. - s.bind(new InetSocketAddress(server.getLocalAddress(), 0)); + s.bind(new InetSocketAddress(serverAddress, 0)); if (connectTimeout >= 0) { s.connect(dest, connectTimeout); } else { @@ -816,7 +828,9 @@ * @see #setActiveMode() */ public sun.net.ftp.FtpClient enablePassiveMode(boolean passive) { - passiveMode = passive; + + // Only passive mode used in JDK. See Bug 8010784. + // passiveMode = passive; return this; }