From 01b00b09ff597fed11de0860970164f63c8fb8ac Mon Sep 17 00:00:00 2001 From: Jean-Christophe Cura Date: Thu, 18 Sep 2025 11:06:25 +0200 Subject: [PATCH 1/2] Convert to Hex only on Encoding.UTF8.GetString possible exception Has OutOfMemory exceptions can occure in native Encoding.UTF8.GetString, we should not convert result to hex values --- src/StackExchange.Redis/RedisValue.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/StackExchange.Redis/RedisValue.cs b/src/StackExchange.Redis/RedisValue.cs index 0eb1a5812..750e9ed83 100644 --- a/src/StackExchange.Redis/RedisValue.cs +++ b/src/StackExchange.Redis/RedisValue.cs @@ -784,7 +784,10 @@ private static bool TryParseDouble(ReadOnlySpan blob, out double value) { return Format.GetString(span); } - catch + catch (Exception e) when // Only catch exception throwed by Encoding.UTF8.GetString + (e is DecoderFallbackException + || e is ArgumentException + || e is ArgumentNullException) { return ToHex(span); } From 31b545e8a0d0ec3a9a943efcbcef8b31ee65320b Mon Sep 17 00:00:00 2001 From: Jean-Christophe Cura Date: Thu, 18 Sep 2025 17:13:37 +0200 Subject: [PATCH 2/2] Fix other cases where we return an Hex string on all kind of exceptions --- src/StackExchange.Redis/RedisChannel.cs | 7 +++++-- src/StackExchange.Redis/RedisKey.cs | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/StackExchange.Redis/RedisChannel.cs b/src/StackExchange.Redis/RedisChannel.cs index f6debd1eb..2e0d7fc6c 100644 --- a/src/StackExchange.Redis/RedisChannel.cs +++ b/src/StackExchange.Redis/RedisChannel.cs @@ -302,9 +302,12 @@ public static implicit operator RedisChannel(byte[]? key) { return Encoding.UTF8.GetString(arr); } - catch + catch (Exception e) when // Only catch exception throwed by Encoding.UTF8.GetString + (e is DecoderFallbackException + || e is ArgumentException + || e is ArgumentNullException) { - return BitConverter.ToString(arr); + return BitConverter.ToString(arr); } } diff --git a/src/StackExchange.Redis/RedisKey.cs b/src/StackExchange.Redis/RedisKey.cs index 9bfc041b1..0ee83d560 100644 --- a/src/StackExchange.Redis/RedisKey.cs +++ b/src/StackExchange.Redis/RedisKey.cs @@ -299,9 +299,12 @@ public static implicit operator RedisKey(byte[]? key) { return Encoding.UTF8.GetString(arr, 0, length); } - catch + catch (Exception e) when // Only catch exception throwed by Encoding.UTF8.GetString + (e is DecoderFallbackException + || e is ArgumentException + || e is ArgumentNullException) { - return BitConverter.ToString(arr, 0, length); + return BitConverter.ToString(arr, 0, length); } } }