diff --git a/bifromq-util/src/main/java/org/apache/bifromq/util/TopicUtil.java b/bifromq-util/src/main/java/org/apache/bifromq/util/TopicUtil.java index 73288fd49..21f3e0028 100644 --- a/bifromq-util/src/main/java/org/apache/bifromq/util/TopicUtil.java +++ b/bifromq-util/src/main/java/org/apache/bifromq/util/TopicUtil.java @@ -110,6 +110,9 @@ public static boolean isValidTopicFilter(String topicFilter, int maxLevelLength, topicLevelLength = 0; // skip one separator to real topicFilter start pos i++; + if (i >= topicFilter.length()) { + return false; + } } int startIdx = i; int level = 1; diff --git a/bifromq-util/src/test/java/org/apache/bifromq/util/TopicUtilsTest.java b/bifromq-util/src/test/java/org/apache/bifromq/util/TopicUtilsTest.java index 25b096a83..2ea138fa2 100644 --- a/bifromq-util/src/test/java/org/apache/bifromq/util/TopicUtilsTest.java +++ b/bifromq-util/src/test/java/org/apache/bifromq/util/TopicUtilsTest.java @@ -132,7 +132,7 @@ public void testIsValidTopicFilter() { assertTrue(TopicUtil.isValidTopicFilter("$oshare", 10, 4, 100)); assertTrue(TopicUtil.isValidTopicFilter("$shared/", 10, 4, 10)); assertTrue(TopicUtil.isValidTopicFilter("$oshared/", 10, 4, 100)); - assertTrue(TopicUtil.isValidTopicFilter("$share/g/", 10, 4, 100)); + assertFalse(TopicUtil.isValidTopicFilter("$share/g/", 10, 4, 100)); assertTrue(TopicUtil.isValidTopicFilter("$share/g//", 10, 4, 100)); assertFalse(TopicUtil.isValidTopicFilter("$share/g/abcdef/", 5, 4, 10)); assertFalse(TopicUtil.isValidTopicFilter("$share/g/1/2/3/4/5", 5, 4, 255));