summaryrefslogtreecommitdiff
path: root/java/net
diff options
context:
space:
mode:
authorGary Benson <gbenson@redhat.com>2006-08-29 08:25:15 +0000
committerGary Benson <gbenson@redhat.com>2006-08-29 08:25:15 +0000
commit938842c9aca17990cb9f825a9de64592ff07f695 (patch)
tree1ac9cd7116e9db618091828d08f6a7286c8a2a4e /java/net
parent8de7a58b583ed7a20103e0de8fefff476740e75e (diff)
downloadclasspath-938842c9aca17990cb9f825a9de64592ff07f695.tar.gz
2006-08-29 Gary Benson <gbenson@redhat.com>
* java/net/SocketPermission.java (maybeBracketIPv6Address): New method. (<init>): Pass the hostport argument through the above. * java/net/NetworkInterface.java (getInetAddresses): Don't bracket IPv6 addresses.
Diffstat (limited to 'java/net')
-rw-r--r--java/net/NetworkInterface.java5
-rw-r--r--java/net/SocketPermission.java48
2 files changed, 47 insertions, 6 deletions
diff --git a/java/net/NetworkInterface.java b/java/net/NetworkInterface.java
index f6db01b71..47b1c67ca 100644
--- a/java/net/NetworkInterface.java
+++ b/java/net/NetworkInterface.java
@@ -112,10 +112,7 @@ public final class NetworkInterface
InetAddress addr = (InetAddress) addresses.nextElement();
try
{
- String hostAddress = addr.getHostAddress();
- if (addr instanceof Inet6Address)
- hostAddress = "[" + hostAddress + "]";
- s.checkConnect(hostAddress, 58000);
+ s.checkConnect(addr.getHostAddress(), 58000);
tmpInetAddresses.add(addr);
}
catch (SecurityException e)
diff --git a/java/net/SocketPermission.java b/java/net/SocketPermission.java
index 723ccc7a5..a722fcad4 100644
--- a/java/net/SocketPermission.java
+++ b/java/net/SocketPermission.java
@@ -164,13 +164,57 @@ public final class SocketPermission extends Permission implements Serializable
*/
public SocketPermission(String hostport, String actions)
{
- super(hostport);
+ super(maybeBracketIPv6Address(hostport));
- setHostPort(hostport);
+ setHostPort(getName());
setActions(actions);
}
/**
+ * IPv6 addresses in the hostport must either be enclosed by
+ * "[" and "]" or be specified in the full uncompressed form.
+ * In the latter case proprietary JVMs will quote the address
+ * with "[" and "]", so we do to.
+ */
+ private static String maybeBracketIPv6Address(String hostport)
+ {
+ if (hostport.length() == 0 || hostport.charAt(0) == '[')
+ return hostport;
+
+ int colons = 0, last_colon = 0;
+ for (int i = 0; i < hostport.length(); i++)
+ {
+ if (hostport.charAt(i) == ':')
+ {
+ if (i - last_colon == 1)
+ throw new IllegalArgumentException("Ambiguous hostport part");
+ colons++;
+ last_colon = i;
+ }
+ }
+
+ switch (colons)
+ {
+ case 0:
+ case 1:
+ // a hostname or IPv4 address
+ return hostport;
+
+ case 7:
+ // an IPv6 address with no ports
+ return "[" + hostport + "]";
+
+ case 8:
+ // an IPv6 address with ports
+ return "[" + hostport.substring(0, last_colon) + "]"
+ + hostport.substring(last_colon);
+
+ default:
+ throw new IllegalArgumentException("Ambiguous hostport part");
+ }
+ }
+
+ /**
* Parse the hostport argument to the constructor.
*/
private void setHostPort(String hostport)