From 6b0da91d258d1659ec89cecef53de7dc356b991c Mon Sep 17 00:00:00 2001 From: Gary Benson Date: Tue, 29 Aug 2006 08:15:29 +0000 Subject: 2006-08-29 Gary Benson * java/net/SocketPermission.java (maybeBracketIPv6Address): New method. (): Pass the hostport argument through the above. * java/net/NetworkInterface.java (getInetAddresses): Revert the previous change. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@116557 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/classpath/ChangeLog.gcj | 9 +++++ libjava/classpath/java/net/NetworkInterface.java | 5 +-- libjava/classpath/java/net/SocketPermission.java | 48 +++++++++++++++++++++++- 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/libjava/classpath/ChangeLog.gcj b/libjava/classpath/ChangeLog.gcj index fda8d79d45f..adac6b7f02b 100644 --- a/libjava/classpath/ChangeLog.gcj +++ b/libjava/classpath/ChangeLog.gcj @@ -1,3 +1,12 @@ +2006-08-29 Gary Benson + + * java/net/SocketPermission.java + (maybeBracketIPv6Address): New method. + (): Pass the hostport argument through the above. + + * java/net/NetworkInterface.java (getInetAddresses): + Revert the previous change. + 2006-08-24 Gary Benson * java/net/NetworkInterface.java (getInetAddresses): Bracket IPv6 diff --git a/libjava/classpath/java/net/NetworkInterface.java b/libjava/classpath/java/net/NetworkInterface.java index f6db01b7182..47b1c67cae7 100644 --- a/libjava/classpath/java/net/NetworkInterface.java +++ b/libjava/classpath/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/libjava/classpath/java/net/SocketPermission.java b/libjava/classpath/java/net/SocketPermission.java index 723ccc7a5b5..a722fcad4e5 100644 --- a/libjava/classpath/java/net/SocketPermission.java +++ b/libjava/classpath/java/net/SocketPermission.java @@ -164,12 +164,56 @@ 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. */ -- cgit v1.2.3