From 1923978f8824aed54352b0afac0e53c1d96e112b Mon Sep 17 00:00:00 2001 From: Jens Deppe Date: Fri, 13 May 2022 12:22:55 -0700 Subject: [PATCH] Fix potential `NullPointerException` when using Jedis Cluster `BZPOP*`. For the Jedis-based implementations of bzpopmin and bzpopmax, a NPE is thrown if the provided timeout elapses and the server responds with a null array. Closes #2324 --- .../redis/connection/jedis/JedisClusterZSetCommands.java | 2 +- .../redis/connection/jedis/JedisClusterConnectionTests.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterZSetCommands.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterZSetCommands.java index f7b6cf1f6..76a83603e 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterZSetCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterZSetCommands.java @@ -1256,7 +1256,7 @@ class JedisClusterZSetCommands implements RedisZSetCommands { @SuppressWarnings("unchecked") private static Tuple toTuple(List bytes) { - if (bytes.isEmpty()) { + if (bytes == null || bytes.isEmpty()) { return null; } diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java index 178a3a0ff..480ff50b5 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java @@ -2155,6 +2155,9 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @EnabledOnCommand("BZPOPMIN") public void bzPopMinShouldWorkCorrectly() { + assertThat(clusterConnection.bZPopMin(KEY_1_BYTES, 1, TimeUnit.MILLISECONDS)) + .isNull(); + nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 30D, VALUE_3_BYTES); @@ -2180,6 +2183,9 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @EnabledOnCommand("BZPOPMAX") public void bzPopMaxShouldWorkCorrectly() { + assertThat(clusterConnection.bZPopMax(KEY_1_BYTES, 1, TimeUnit.MILLISECONDS)) + .isNull(); + nativeConnection.zadd(KEY_1_BYTES, 10D, VALUE_1_BYTES); nativeConnection.zadd(KEY_1_BYTES, 20D, VALUE_2_BYTES); nativeConnection.zadd(KEY_1_BYTES, 30D, VALUE_3_BYTES);