From 7e743be9d873178e9bf94c91f8017a0865431c23 Mon Sep 17 00:00:00 2001 From: missing Date: Sun, 14 Aug 2022 18:31:10 -0500 Subject: [PATCH] found the soundness hole --- src/impls.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/impls.rs b/src/impls.rs index 4cbd5e6..776d3ec 100644 --- a/src/impls.rs +++ b/src/impls.rs @@ -6,6 +6,7 @@ use std::{ fmt::Debug, mem::size_of, ops::{Deref, DerefMut}, + ptr::NonNull, slice, vec::Vec as StdVec, }; @@ -161,13 +162,21 @@ impl Deref for Vec { type Target = [T]; fn deref(&self) -> &Self::Target { - unsafe { slice::from_raw_parts(self.get_ptr(0), self.len) } + if self.is_empty() { + unsafe { slice::from_raw_parts(NonNull::dangling().as_ptr(), 0) } + } else { + unsafe { slice::from_raw_parts(self.get_ptr(0), self.len) } + } } } impl DerefMut for Vec { fn deref_mut(&mut self) -> &mut Self::Target { - unsafe { slice::from_raw_parts_mut(self.get_ptr(0) as _, self.len) } + if self.is_empty() { + unsafe { slice::from_raw_parts_mut(NonNull::dangling().as_ptr(), 0) } + } else { + unsafe { slice::from_raw_parts_mut(self.get_ptr(0) as _, self.len) } + } } }