summaryrefslogtreecommitdiff
path: root/java/openjdk6/files/icedtea/security/20130618/8001318-6_fixup.patch
diff options
context:
space:
mode:
Diffstat (limited to 'java/openjdk6/files/icedtea/security/20130618/8001318-6_fixup.patch')
-rw-r--r--java/openjdk6/files/icedtea/security/20130618/8001318-6_fixup.patch114
1 files changed, 114 insertions, 0 deletions
diff --git a/java/openjdk6/files/icedtea/security/20130618/8001318-6_fixup.patch b/java/openjdk6/files/icedtea/security/20130618/8001318-6_fixup.patch
new file mode 100644
index 000000000000..e94edecbc50b
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130618/8001318-6_fixup.patch
@@ -0,0 +1,114 @@
+# HG changeset patch
+# User andrew
+# Date 1371826938 18000
+# Node ID ccd06d9c7258aea155d7053d399431bcd1af4405
+# Parent 662fbd43808413b2bd7ae4ae95683da98999023e
+Fix up 8001318
+
+diff --git a/src/share/classes/java/net/ServerSocket.java b/src/share/classes/java/net/ServerSocket.java
+--- jdk/src/share/classes/java/net/ServerSocket.java
++++ jdk/src/share/classes/java/net/ServerSocket.java
+@@ -363,7 +363,7 @@
+ }
+ return in;
+ } catch (SecurityException e) {
+- return InetAddress.getLoopbackAddress();
++ return InetAddress.impl.loopbackAddress();
+ } catch (SocketException e) {
+ // nothing
+ // If we're bound, the impl has been created
+@@ -675,7 +675,7 @@
+ if (!NetUtil.doRevealLocalAddress() &&
+ System.getSecurityManager() != null)
+ {
+- in = InetAddress.getLoopbackAddress();
++ in = InetAddress.impl.loopbackAddress();
+ } else {
+ in = impl.getInetAddress();
+ }
+diff --git a/src/share/classes/java/net/Socket.java b/src/share/classes/java/net/Socket.java
+--- jdk/src/share/classes/java/net/Socket.java
++++ jdk/src/share/classes/java/net/Socket.java
+@@ -666,7 +666,7 @@
+ in = InetAddress.anyLocalAddress();
+ }
+ } catch (SecurityException e) {
+- in = InetAddress.getLoopbackAddress();
++ in = InetAddress.impl.loopbackAddress();
+ } catch (Exception e) {
+ in = InetAddress.anyLocalAddress(); // "0.0.0.0"
+ }
+diff --git a/src/share/classes/sun/nio/ch/Net.java b/src/share/classes/sun/nio/ch/Net.java
+--- jdk/src/share/classes/sun/nio/ch/Net.java
++++ jdk/src/share/classes/sun/nio/ch/Net.java
+@@ -29,7 +29,8 @@
+ import java.lang.reflect.*;
+ import java.net.*;
+ import java.nio.channels.*;
+-
++import java.security.AccessController;
++import java.security.PrivilegedExceptionAction;
+
+ class Net { // package-private
+
+@@ -233,4 +234,60 @@
+ initIDs();
+ }
+
++ /**
++ * 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;
++
++ if (!getRevealLocalAddress()) {
++ // Return loopback address only if security check fails
++ try{
++ sm.checkConnect(addr.getAddress().getHostAddress(), -1);
++ //Security check passed
++ } catch (SecurityException e) {
++ //Return loopback address
++ addr = getLoopbackAddress(addr.getPort());
++ }
++ }
++ return addr;
++ }
++
++ static String getRevealedLocalAddressAsString(InetSocketAddress addr) {
++ if (!getRevealLocalAddress() && System.getSecurityManager() != null)
++ addr = getLoopbackAddress(addr.getPort());
++ return addr.toString();
++ }
++
++ private static boolean getRevealLocalAddress() {
++ if (!propRevealLocalAddress) {
++ try {
++ revealLocalAddress = Boolean.parseBoolean(
++ AccessController.doPrivileged(
++ new PrivilegedExceptionAction<String>() {
++ public String run() {
++ return System.getProperty(
++ "jdk.net.revealLocalAddress");
++ }
++ }));
++
++ } catch (Exception e) {
++ // revealLocalAddress is false
++ }
++ propRevealLocalAddress = true;
++ }
++ return revealLocalAddress;
++ }
++
++ private static InetSocketAddress getLoopbackAddress(int port) {
++ try {
++ return new InetSocketAddress(InetAddress.getByName(null),
++ port);
++ } catch (UnknownHostException e) {
++ throw new InternalError("Shouldn't reach here.");
++ }
++ }
++
+ }