This is an automated email from the ASF dual-hosted git repository.
tabish pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/artemis.git
The following commit(s) were added to refs/heads/main by this push:
new 3a74b67c66 ARTEMIS-5809 detect escaped delimiters w/parsing address
paths
3a74b67c66 is described below
commit 3a74b67c66cfd7452847a59d509e16d206ebd121
Author: Justin Bertram <[email protected]>
AuthorDate: Wed Dec 10 11:51:43 2025 -0600
ARTEMIS-5809 detect escaped delimiters w/parsing address paths
---
.../apache/activemq/artemis/api/core/SimpleString.java | 6 ++++--
.../activemq/artemis/utils/SimpleStringTest.java | 18 ++++++++++++++++++
.../artemis/tests/integration/mqtt5/MQTT5Test.java | 16 ++++++++++++++++
3 files changed, 38 insertions(+), 2 deletions(-)
diff --git
a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
index 685dd6923e..4ab391e856 100644
---
a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
+++
b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
@@ -372,8 +372,10 @@ public final class SimpleString implements CharSequence,
Serializable, Comparabl
}
List<String> pathsList = new ArrayList<>();
StringBuilder pathAccumulator = new StringBuilder();
- for (char c : toString().toCharArray()) {
- if (c == separator) {
+ char[] chars = toString().toCharArray();
+ for (int i = 0; i < chars.length; i++) {
+ char c = chars[i];
+ if (c == separator && (i == 0 || chars[i - 1] != '\\')) {
pathsList.add(pathAccumulator.toString());
pathAccumulator.delete(0, pathAccumulator.length());
} else {
diff --git
a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/SimpleStringTest.java
b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/SimpleStringTest.java
index 181961179f..fb8a497790 100644
---
a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/SimpleStringTest.java
+++
b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/SimpleStringTest.java
@@ -24,12 +24,30 @@ import io.netty.buffer.ByteBufAllocator;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class SimpleStringTest {
+ @Test
+ public void testGetPaths() {
+ final char delimiter = '.';
+
+ assertArrayEquals(List.of("a").toArray(),
SimpleString.of("a").getPaths(delimiter));
+ assertArrayEquals(List.of("a\\.b").toArray(),
SimpleString.of("a\\.b").getPaths(delimiter));
+
+ assertArrayEquals(List.of("a", "b").toArray(),
SimpleString.of("a.b").getPaths(delimiter));
+ assertArrayEquals(List.of("a", "b\\.c").toArray(),
SimpleString.of("a.b\\.c").getPaths(delimiter));
+ assertArrayEquals(List.of("a\\.b", "c").toArray(),
SimpleString.of("a\\.b.c").getPaths(delimiter));
+
+ assertArrayEquals(List.of("a", "b", "c").toArray(),
SimpleString.of("a.b.c").getPaths(delimiter));
+ assertArrayEquals(List.of("a", "b", "c\\.d").toArray(),
SimpleString.of("a.b.c\\.d").getPaths(delimiter));
+ assertArrayEquals(List.of("a", "b\\.c", "d").toArray(),
SimpleString.of("a.b\\.c.d").getPaths(delimiter));
+ assertArrayEquals(List.of("a\\.b", "c", "d").toArray(),
SimpleString.of("a\\.b.c.d").getPaths(delimiter));
+ }
+
@Test
public void testOutOfBoundsThrownOnMalformedString() {
ByteBuf byteBuffer = ByteBufAllocator.DEFAULT.buffer(5);
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/mqtt5/MQTT5Test.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/mqtt5/MQTT5Test.java
index 9ace7e9118..dcae8935a2 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/mqtt5/MQTT5Test.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/mqtt5/MQTT5Test.java
@@ -1001,4 +1001,20 @@ public class MQTT5Test extends MQTT5TestSupport {
// ensure the subscription queue uses multicast even though the default
is anycast
assertEquals(RoutingType.MULTICAST, getSubscriptionQueue(topic,
clientID).getRoutingType());
}
+
+ @Test
+ @Timeout(DEFAULT_TIMEOUT_SEC)
+ public void testPublishWithDelimiterInTopicNameAndWildcardSubscription()
throws Exception {
+ CountDownLatch latch = new CountDownLatch(1);
+ MqttClient subscriber = createPahoClient("subscriber");
+ subscriber.connect();
+ subscriber.setCallback(new LatchedMqttCallback(latch));
+ subscriber.subscribe("prefix/+", AT_LEAST_ONCE);
+
+ MqttClient producer = createPahoClient("producer");
+ producer.connect();
+ producer.publish("prefix/a.b",
"myMessage".getBytes(StandardCharsets.UTF_8), 1, false);
+
+ assertTrue(latch.await(500, TimeUnit.MILLISECONDS));
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]