2006-08-29 Gary Benson <gbenson@redhat.com>
authorGary Benson <gbenson@redhat.com>
Tue, 29 Aug 2006 08:15:29 +0000 (08:15 +0000)
committerGary Benson <gary@gcc.gnu.org>
Tue, 29 Aug 2006 08:15:29 +0000 (08:15 +0000)
* java/net/SocketPermission.java
(maybeBracketIPv6Address): New method.
(<init>): Pass the hostport argument through the above.

* java/net/NetworkInterface.java (getInetAddresses):
Revert the previous change.

From-SVN: r116557

libjava/classpath/ChangeLog.gcj
libjava/classpath/java/net/NetworkInterface.java
libjava/classpath/java/net/SocketPermission.java

index fda8d79..adac6b7 100644 (file)
@@ -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):
+       Revert the previous change.
+
 2006-08-24  Gary Benson  <gbenson@redhat.com>
 
        * java/net/NetworkInterface.java (getInetAddresses): Bracket IPv6
index f6db01b..47b1c67 100644 (file)
@@ -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)
index 723ccc7..a722fca 100644 (file)
@@ -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)