# HG changeset patch # User jbachorik # Date 1367493669 -7200 # Node ID 9259f4bb1c4866661665bee05e28d379d3cfba75 # Parent cb03ce64ed07d6326aa48b6aec78a3082085bf89 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 diff -r cb03ce64ed07 -r 9259f4bb1c48 jdk/src/share/classes/javax/management/remote/rmi/RMIServerImpl.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); } diff -r cb03ce64ed07 -r 9259f4bb1c48 jdk/test/javax/management/remote/mandatory/connection/ConnectionTest.java --- 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 + "\"");