From 2274b5e10894bb7ff89469f8c5dffcd63ec2b51d Mon Sep 17 00:00:00 2001 From: zjncs <18910855655@163.com> Date: Fri, 11 Sep 2026 13:38:52 +0800 Subject: [PATCH] fix(common): do not throw on endpoint without dot in parseInstanceIdFromEndpoint parseInstanceIdFromEndpoint used the result of endpoint.indexOf('.') directly as the substring end index, so any non-empty endpoint without a dot (for example "MQ_INST_123456789_BXXUzaee:80") produced -1 and threw StringIndexOutOfBoundsException from a public utility. Treat a missing dot as a non-instance endpoint and return null. --- .../rocketmq/common/utils/NameServerAddressUtils.java | 6 +++++- .../rocketmq/common/utils/NameServerAddressUtilsTest.java | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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))