diff options
author | Gary Benson <gbenson@redhat.com> | 2006-08-29 08:25:15 +0000 |
---|---|---|
committer | Gary Benson <gbenson@redhat.com> | 2006-08-29 08:25:15 +0000 |
commit | 938842c9aca17990cb9f825a9de64592ff07f695 (patch) | |
tree | 1ac9cd7116e9db618091828d08f6a7286c8a2a4e | |
parent | 8de7a58b583ed7a20103e0de8fefff476740e75e (diff) | |
download | classpath-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.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | java/net/NetworkInterface.java | 5 | ||||
-rw-r--r-- | java/net/SocketPermission.java | 48 |
3 files changed, 56 insertions, 6 deletions
@@ -1,3 +1,12 @@ +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. + 2006-08-28 Roman Kennke <kennke@aicas.com> * javax/swing/text/BoxView.java 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) |