From d7cab20bccb3acfa1307a83a22c6440762d6a894 Mon Sep 17 00:00:00 2001 From: belljun3395 <195850@jnu.ac.kr> Date: Sun, 22 Jun 2025 09:45:57 +0900 Subject: [PATCH] Escape backslashes in source string before loading properties Signed-off-by: belljun3395 <195850@jnu.ac.kr> --- .../data/redis/connection/convert/Converters.java | 4 +++- .../connection/convert/ConvertersUnitTests.java | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/redis/connection/convert/Converters.java b/src/main/java/org/springframework/data/redis/connection/convert/Converters.java index 2d4eb2cb59..d331c602e6 100644 --- a/src/main/java/org/springframework/data/redis/connection/convert/Converters.java +++ b/src/main/java/org/springframework/data/redis/connection/convert/Converters.java @@ -63,6 +63,7 @@ * @author John Blum * @author Sorokin Evgeniy * @author Marcin Grzejszczak + * @author JongJun Kim */ public abstract class Converters { @@ -107,7 +108,8 @@ public static Properties toProperties(String source) { Properties info = new Properties(); - try (StringReader stringReader = new StringReader(source)) { + String sourceToLoad = source.replace("\\", "\\\\"); + try (StringReader stringReader = new StringReader(sourceToLoad)) { info.load(stringReader); } catch (Exception ex) { throw new RedisSystemException("Cannot read Redis info", ex); diff --git a/src/test/java/org/springframework/data/redis/connection/convert/ConvertersUnitTests.java b/src/test/java/org/springframework/data/redis/connection/convert/ConvertersUnitTests.java index 6c7c248558..4061c2316e 100644 --- a/src/test/java/org/springframework/data/redis/connection/convert/ConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/convert/ConvertersUnitTests.java @@ -38,6 +38,7 @@ * @author Mark Paluch * @author Sorokin Evgeniy * @author Marcin Grzejszczak + * @author JongJun Kim */ class ConvertersUnitTests { @@ -77,6 +78,13 @@ class ConvertersUnitTests { private static final String CLUSTER_NODE_WITH_SINGLE_IPV4_HOSTNAME = "3765733728631672640db35fd2f04743c03119c6 10.180.0.33:11003@16379,hostname1 master - 0 1708041426947 2 connected 0-5460"; + private static final String WINDOWS_INFO_RESPONSE = "# Server\r\n" // + + "redis_version:3.0.504\r\n" // + + "redis_mode:standalone\r\n" // + + "os:Windows\r\n" // + + "executable:C:\\Program Files\\Redis\\redis-server.exe\r\n" // + + "config_file:C:\\Program Files\\Redis\\redis.windows.conf\r\n"; + @Test // DATAREDIS-315 void toSetOfRedis30ClusterNodesShouldConvertSingleStringNodesResponseCorrectly() { @@ -367,4 +375,11 @@ static Stream clusterNodesEndpoints() { return Stream.concat(regular, weird); } + + @Test // GH-3099 + void toPropertiesShouldParseInfoStringWithWindowsPaths() { + + assertThat(Converters.toProperties(WINDOWS_INFO_RESPONSE)).containsEntry("executable", + "C:\\Program Files\\Redis\\redis-server.exe"); + } }