7199324: Connection ID for IPv6 addresses is not generated accordingly to the specification
authorjbachorik
Thu, 02 May 2013 13:21:09 +0200
changeset 17425 9259f4bb1c48
parent 17424 cb03ce64ed07
child 17426 45db19517346
7199324: Connection ID for IPv6 addresses is not generated accordingly to the specification Summary: RemoteServer.getClientHost is returning a String with an IPv6 literal address and we need to enclose it in [] when building the connection id Reviewed-by: alanb, sjiang
jdk/src/share/classes/javax/management/remote/rmi/RMIServerImpl.java
jdk/test/javax/management/remote/mandatory/connection/ConnectionTest.java
--- a/jdk/src/share/classes/javax/management/remote/rmi/RMIServerImpl.java	Fri May 03 10:43:24 2013 +0800
+++ b/jdk/src/share/classes/javax/management/remote/rmi/RMIServerImpl.java	Thu May 02 13:21:09 2013 +0200
@@ -474,6 +474,15 @@
         String clientHost = "";
         try {
             clientHost = RemoteServer.getClientHost();
+            /*
+             * According to the rules specified in the javax.management.remote
+             * package description, a numeric IPv6 address (detected by the
+             * presence of otherwise forbidden ":" character) forming a part
+             * of the connection id must be enclosed in square brackets.
+             */
+            if (clientHost.contains(":")) {
+                clientHost = "[" + clientHost + "]";
+            }
         } catch (ServerNotActiveException e) {
             logger.trace("makeConnectionId", "getClientHost", e);
         }
--- a/jdk/test/javax/management/remote/mandatory/connection/ConnectionTest.java	Fri May 03 10:43:24 2013 +0800
+++ b/jdk/test/javax/management/remote/mandatory/connection/ConnectionTest.java	Thu May 02 13:21:09 2013 +0200
@@ -44,6 +44,7 @@
 import java.util.StringTokenizer;
 
 import java.security.Principal;
+import java.util.regex.Pattern;
 import javax.security.auth.Subject;
 
 import javax.management.MBeanServer;
@@ -239,6 +240,18 @@
         return true;
     }
 
+    private static final String IPV4_PTN = "^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}(\\:[1-9][0-9]{3})?$";
+
+    /**
+     * Checks the connection id for validity.
+     * The {@link
+     * javax.management.remote package description} describes the
+     * conventions for connection IDs.
+     * @param proto Connection protocol
+     * @param clientConnId The connection ID
+     * @return Returns {@code true} if the connection id conforms to the specification; {@code false} otherwise.
+     * @throws Exception
+     */
     private static boolean checkConnectionId(String proto, String clientConnId)
             throws Exception {
         StringTokenizer tok = new StringTokenizer(clientConnId, " ", true);
@@ -249,6 +262,17 @@
                                "\"");
             return false;
         }
+
+        int hostAddrInd = s.indexOf("//");
+        if (hostAddrInd > -1) {
+            s = s.substring(hostAddrInd + 2);
+            if (!Pattern.matches(IPV4_PTN, s)) {
+                if (!s.startsWith("[") || !s.endsWith("]")) {
+                    System.out.println("IPv6 address must be enclosed in \"[]\"");
+                    return false;
+                }
+            }
+        }
         s = tok.nextToken();
         if (!s.equals(" ")) {
             System.out.println("Expected \" \", found \"" + s + "\"");