From ea8af2edad83ac2dd433a703431df5ab2339da10 Mon Sep 17 00:00:00 2001 From: zjncs <18910855655@163.com> Date: Wed, 9 Sep 2026 18:24:23 +0800 Subject: [PATCH] [ISSUE #S5] Clamp negative maxNum in IndexService.queryOffset maxNum reaches queryOffset straight from QueryMessageRequestHeader, where it is only checked for null. A negative value survives the Math.min(maxNum, maxMsgsNumBatch) cap and makes new ArrayList<>(maxNum) throw IllegalArgumentException: Illegal Capacity, which propagates to the caller as an opaque failure instead of an empty result. Clamp it to 0. Signed-off-by: zjncs <18910855655@163.com> --- .../java/org/apache/rocketmq/store/index/IndexService.java | 5 ++++- .../org/apache/rocketmq/store/index/IndexServiceTest.java | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/store/src/main/java/org/apache/rocketmq/store/index/IndexService.java b/store/src/main/java/org/apache/rocketmq/store/index/IndexService.java index 1a180e4442b..35e05864c25 100644 --- a/store/src/main/java/org/apache/rocketmq/store/index/IndexService.java +++ b/store/src/main/java/org/apache/rocketmq/store/index/IndexService.java @@ -173,7 +173,10 @@ public QueryOffsetResult queryOffset(String topic, String key, int maxNum, long public QueryOffsetResult queryOffset(String topic, String key, int maxNum, long begin, long end, String indexType) { long indexLastUpdateTimestamp = 0; long indexLastUpdatePhyoffset = 0; - maxNum = Math.min(maxNum, this.defaultMessageStore.getMessageStoreConfig().getMaxMsgsNumBatch()); + // maxNum comes from the request header and is only checked for null, + // so a negative value must be clamped here instead of blowing up the + // ArrayList allocation below with an IllegalArgumentException. + maxNum = Math.min(Math.max(maxNum, 0), this.defaultMessageStore.getMessageStoreConfig().getMaxMsgsNumBatch()); List phyOffsets = new ArrayList<>(maxNum); try { this.readWriteLock.readLock().lock(); diff --git a/store/src/test/java/org/apache/rocketmq/store/index/IndexServiceTest.java b/store/src/test/java/org/apache/rocketmq/store/index/IndexServiceTest.java index bd520e6a483..982dd2296db 100644 --- a/store/src/test/java/org/apache/rocketmq/store/index/IndexServiceTest.java +++ b/store/src/test/java/org/apache/rocketmq/store/index/IndexServiceTest.java @@ -81,4 +81,11 @@ public void testQueryOffsetWithZeroMaxNum() { assertNotNull(result); assertEquals(Collections.emptyList(), result.getPhyOffsets()); } + + @Test + public void testQueryOffsetWithNegativeMaxNum() { + QueryOffsetResult result = indexService.queryOffset("test", "testKey", -1, 0, 100); + assertNotNull(result); + assertEquals(Collections.emptyList(), result.getPhyOffsets()); + } }