diff --git a/src/share/classes/javax/management/remote/rmi/RMIServerImpl.java b/src/share/classes/javax/management/remote/rmi/RMIServerImpl.java index 0b6ad75e4cb113a1af96da46d501241e1dd775d4..2226f6c81623211109abeba48309c23cdfaed638 100644 --- a/src/share/classes/javax/management/remote/rmi/RMIServerImpl.java +++ b/src/share/classes/javax/management/remote/rmi/RMIServerImpl.java @@ -474,6 +474,15 @@ public abstract class RMIServerImpl implements Closeable, RMIServer { 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 --git a/test/javax/management/remote/mandatory/connection/ConnectionTest.java b/test/javax/management/remote/mandatory/connection/ConnectionTest.java index c375ca1ea8e0b96833c97362cc27dd0bd1bc69f7..d26be3bfd530635a29fb5a7acf2b653d8b2ebb36 100644 --- a/test/javax/management/remote/mandatory/connection/ConnectionTest.java +++ b/test/javax/management/remote/mandatory/connection/ConnectionTest.java @@ -44,6 +44,7 @@ import java.util.Set; 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 @@ public class ConnectionTest { 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 @@ public class ConnectionTest { "\""); 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 + "\"");