From 4a0a0b86ecbb81c3478599eb97bb4996789217cf Mon Sep 17 00:00:00 2001
From: librelois <c@elo.tf>
Date: Sat, 5 Jun 2021 18:57:46 +0200
Subject: [PATCH] fix(kv_typed): deser empty bytes with get_ref_slice

---
 tools/kv_typed/src/as_bytes.rs                 | 4 ++--
 tools/kv_typed/src/backend/leveldb.rs          | 4 +++-
 tools/kv_typed/src/backend/lmdb.rs             | 4 +++-
 tools/kv_typed/src/backend/memory.rs           | 4 +++-
 tools/kv_typed/src/backend/memory_singleton.rs | 4 +++-
 tools/kv_typed/src/backend/sled.rs             | 4 +++-
 6 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/tools/kv_typed/src/as_bytes.rs b/tools/kv_typed/src/as_bytes.rs
index 4e79a4f..4e8cebe 100644
--- a/tools/kv_typed/src/as_bytes.rs
+++ b/tools/kv_typed/src/as_bytes.rs
@@ -67,11 +67,11 @@ mod tests {
 
     #[test]
     fn test_btreeset_as_bytes() {
-        BTreeSet::<u64>::new().as_bytes(|bytes| assert_eq!(bytes, &[]));
+        BTreeSet::<u64>::new().as_bytes(|bytes| assert!(bytes.is_empty()));
     }
     #[test]
     fn test_hashset_as_bytes() {
-        HashSet::<u64>::new().as_bytes(|bytes| assert_eq!(bytes, &[]));
+        HashSet::<u64>::new().as_bytes(|bytes| assert!(bytes.is_empty()));
     }
 }
 
diff --git a/tools/kv_typed/src/backend/leveldb.rs b/tools/kv_typed/src/backend/leveldb.rs
index 1ecd676..22692c7 100644
--- a/tools/kv_typed/src/backend/leveldb.rs
+++ b/tools/kv_typed/src/backend/leveldb.rs
@@ -171,7 +171,9 @@ impl BackendCol for LevelDbCol {
             self.0
                 .get(ReadOptions::new(), k_bytes)?
                 .map(|bytes| {
-                    if let Some(layout_verified) =
+                    if bytes.is_empty() {
+                        f(&[])
+                    } else if let Some(layout_verified) =
                         zerocopy::LayoutVerified::<_, [V::Elem]>::new_slice(
                             &bytes[V::prefix_len()..],
                         )
diff --git a/tools/kv_typed/src/backend/lmdb.rs b/tools/kv_typed/src/backend/lmdb.rs
index ceb728f..e305328 100644
--- a/tools/kv_typed/src/backend/lmdb.rs
+++ b/tools/kv_typed/src/backend/lmdb.rs
@@ -324,7 +324,9 @@ impl BackendCol for LmdbCol {
                 .get::<_, [u8]>(&self.inner.tree, k_bytes)
                 .to_opt()?
                 .map(|bytes| {
-                    if let Some(layout_verified) =
+                    if bytes.is_empty() {
+                        f(&[])
+                    } else if let Some(layout_verified) =
                         zerocopy::LayoutVerified::<_, [V::Elem]>::new_slice(
                             &bytes[V::prefix_len()..],
                         )
diff --git a/tools/kv_typed/src/backend/memory.rs b/tools/kv_typed/src/backend/memory.rs
index f9c4187..0d50e78 100644
--- a/tools/kv_typed/src/backend/memory.rs
+++ b/tools/kv_typed/src/backend/memory.rs
@@ -138,7 +138,9 @@ impl BackendCol for MemCol {
             self.tree
                 .get(k_bytes)
                 .map(|bytes| {
-                    if let Some(layout_verified) =
+                    if bytes.is_empty() {
+                        f(&[])
+                    } else if let Some(layout_verified) =
                         zerocopy::LayoutVerified::<_, [V::Elem]>::new_slice(
                             &bytes[V::prefix_len()..],
                         )
diff --git a/tools/kv_typed/src/backend/memory_singleton.rs b/tools/kv_typed/src/backend/memory_singleton.rs
index 5f49a8c..786ca4e 100644
--- a/tools/kv_typed/src/backend/memory_singleton.rs
+++ b/tools/kv_typed/src/backend/memory_singleton.rs
@@ -121,7 +121,9 @@ impl BackendCol for MemCol {
         self.0
             .as_ref()
             .map(|bytes| {
-                if let Some(layout_verified) =
+                if bytes.is_empty() {
+                    f(&[])
+                } else if let Some(layout_verified) =
                     zerocopy::LayoutVerified::<_, [V::Elem]>::new_slice(&bytes[V::prefix_len()..])
                 {
                     f(&layout_verified)
diff --git a/tools/kv_typed/src/backend/sled.rs b/tools/kv_typed/src/backend/sled.rs
index 592a6bd..9d13580 100644
--- a/tools/kv_typed/src/backend/sled.rs
+++ b/tools/kv_typed/src/backend/sled.rs
@@ -121,7 +121,9 @@ impl BackendCol for SledCol {
             self.0
                 .get(k_bytes)?
                 .map(|bytes| {
-                    if let Some(layout_verified) =
+                    if bytes.is_empty() {
+                        f(&[])
+                    } else if let Some(layout_verified) =
                         zerocopy::LayoutVerified::<_, [V::Elem]>::new_slice(
                             &bytes[V::prefix_len()..],
                         )
-- 
GitLab