--- a/jdk/src/share/classes/sun/nio/ch/Net.java Thu Mar 28 06:55:42 2013 -0400
+++ b/jdk/src/share/classes/sun/nio/ch/Net.java Thu Mar 28 14:34:18 2013 -0700
@@ -31,6 +31,7 @@
import java.util.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import java.security.PrivilegedExceptionAction;
public class Net {
@@ -183,6 +184,34 @@
}
/**
+ * Returns the local address after performing a SecurityManager#checkConnect.
+ */
+ static InetSocketAddress getRevealedLocalAddress(InetSocketAddress addr) {
+ SecurityManager sm = System.getSecurityManager();
+ if (addr == null || sm == null)
+ return addr;
+
+ try{
+ sm.checkConnect(addr.getAddress().getHostAddress(), -1);
+ // Security check passed
+ } catch (SecurityException e) {
+ // Return loopback address only if security check fails
+ addr = getLoopbackAddress(addr.getPort());
+ }
+ return addr;
+ }
+
+ static String getRevealedLocalAddressAsString(InetSocketAddress addr) {
+ return System.getSecurityManager() == null ? addr.toString() :
+ getLoopbackAddress(addr.getPort()).toString();
+ }
+
+ private static InetSocketAddress getLoopbackAddress(int port) {
+ return new InetSocketAddress(InetAddress.getLoopbackAddress(),
+ port);
+ }
+
+ /**
* Returns any IPv4 address of the given network interface, or
* null if the interface does not have any IPv4 addresses.
*/