From 3106dfce6f54853ebba0bf9006b4decafbcd8a87 Mon Sep 17 00:00:00 2001 From: Bacon2994 <108093786+Bacon2994@users.noreply.github.com> Date: Fri, 8 May 2026 11:09:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(redis):=20=E9=81=BF=E5=85=8D=E5=8F=8D?= =?UTF-8?q?=E6=96=9C=E6=9D=A0=E5=AD=97=E7=AC=A6=E4=B8=B2=E8=AF=AF=E5=88=A4?= =?UTF-8?q?=E4=B8=BA=E4=BA=8C=E8=BF=9B=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/dbx-core/src/db/redis_driver.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/crates/dbx-core/src/db/redis_driver.rs b/crates/dbx-core/src/db/redis_driver.rs index 61c8a0f8b3..b316a25a3b 100644 --- a/crates/dbx-core/src/db/redis_driver.rs +++ b/crates/dbx-core/src/db/redis_driver.rs @@ -310,8 +310,8 @@ fn redis_value_to_string(value: RedisRawValue) -> Option { fn redis_value_contains_binary(value: &RedisRawValue) -> bool { match value { - RedisRawValue::BulkString(bytes) => redis_bytes_need_escape(bytes), - RedisRawValue::VerbatimString { text, .. } => redis_bytes_need_escape(text.as_bytes()), + RedisRawValue::BulkString(bytes) => std::str::from_utf8(bytes).is_err(), + RedisRawValue::VerbatimString { text, .. } => std::str::from_utf8(text.as_bytes()).is_err(), _ => false, } } @@ -344,10 +344,6 @@ fn redis_raw_to_json(value: RedisRawValue) -> serde_json::Value { } } -fn redis_bytes_need_escape(bytes: &[u8]) -> bool { - bytes.iter().any(|&byte| !matches!(byte, 0x20..=0x7e) || byte == b'\\') -} - fn redis_bytes_to_display(bytes: &[u8]) -> String { if let Ok(text) = std::str::from_utf8(bytes) { return text.replace('\\', "\\\\"); @@ -430,7 +426,7 @@ pub async fn set_remove(con: &mut redis::aio::MultiplexedConnection, key: &[u8], mod tests { use super::{ parse_database_count, parse_scan_keys, parse_stream_entries, redis_key_bytes_to_display, - redis_key_bytes_to_raw, redis_key_raw_to_bytes, redis_raw_to_json, RedisRawValue, + redis_key_bytes_to_raw, redis_key_raw_to_bytes, redis_raw_to_json, redis_value_contains_binary, RedisRawValue, }; fn bulk(value: &str) -> RedisRawValue { @@ -541,4 +537,11 @@ mod tests { assert_eq!(value, serde_json::Value::String("\\xac\\xed\\x00\\x05sr".to_string())); } + + #[test] + fn does_not_treat_utf8_with_backslashes_as_binary() { + let raw = RedisRawValue::BulkString(br#"C:\Users\path"#.to_vec()); + + assert!(!redis_value_contains_binary(&raw)); + } }