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]

Reply via email to