diff --git a/common/src/main/java/org/apache/rocketmq/common/utils/NameServerAddressUtils.java b/common/src/main/java/org/apache/rocketmq/common/utils/NameServerAddressUtils.java index 68f883935ae..86c4ea3f8a3 100644 --- a/common/src/main/java/org/apache/rocketmq/common/utils/NameServerAddressUtils.java +++ b/common/src/main/java/org/apache/rocketmq/common/utils/NameServerAddressUtils.java @@ -35,7 +35,11 @@ public static String parseInstanceIdFromEndpoint(String endpoint) { if (StringUtils.isEmpty(endpoint)) { return null; } - return endpoint.substring(endpoint.lastIndexOf("/") + 1, endpoint.indexOf('.')); + int dotIndex = endpoint.indexOf('.'); + if (dotIndex < 0) { + return null; + } + return endpoint.substring(endpoint.lastIndexOf("/") + 1, dotIndex); } public static String getNameSrvAddrFromNamesrvEndpoint(String nameSrvEndpoint) { diff --git a/common/src/test/java/org/apache/rocketmq/common/utils/NameServerAddressUtilsTest.java b/common/src/test/java/org/apache/rocketmq/common/utils/NameServerAddressUtilsTest.java index 38cffdba9dd..7b79d54dc51 100644 --- a/common/src/test/java/org/apache/rocketmq/common/utils/NameServerAddressUtilsTest.java +++ b/common/src/test/java/org/apache/rocketmq/common/utils/NameServerAddressUtilsTest.java @@ -45,6 +45,14 @@ public void testParseInstanceIdFromEndpoint() { "MQ_INST_123456789_BXXUzaee"); } + @Test + public void testParseInstanceIdFromEndpointWithoutDot() { + // an endpoint without a dot is not an instance endpoint; the utility must + // not throw StringIndexOutOfBoundsException on it + assertThat(NameServerAddressUtils.parseInstanceIdFromEndpoint("MQ_INST_123456789_BXXUzaee:80")).isNull(); + assertThat(NameServerAddressUtils.parseInstanceIdFromEndpoint("localhost")).isNull(); + } + @Test public void testGetNameSrvAddrFromNamesrvEndpoint() { assertThat(NameServerAddressUtils.getNameSrvAddrFromNamesrvEndpoint(endpoint1))