diff --git a/src/servers/src/repeated_field.rs b/src/servers/src/repeated_field.rs index 42e22d367a..63dd83f94a 100644 --- a/src/servers/src/repeated_field.rs +++ b/src/servers/src/repeated_field.rs @@ -32,6 +32,8 @@ use std::{fmt, slice, vec}; use bytes::Bytes; +const NULL_BYTES: &[u8] = &[]; + /// anything that can be cleared pub trait Clear { /// Clear this make, make it equivalent to newly created object. @@ -39,7 +41,9 @@ pub trait Clear { } impl Clear for &[u8] { - fn clear(&mut self) {} + fn clear(&mut self) { + *self = NULL_BYTES; + } } impl Clear for Option { @@ -512,3 +516,18 @@ impl fmt::Debug for RepeatedField { self.as_ref().fmt(f) } } + +#[cfg(test)] +mod tests { + use crate::repeated_field::RepeatedField; + + #[test] + fn test_null_ptr() { + let mut vec: RepeatedField<&'static [u8]> = RepeatedField::new(); + let borrowed_value = vec.push_default(); + *borrowed_value = b"hello"; + vec.clear(); + let new_value = vec.push_default(); + assert!((*new_value).is_empty()); + } +}