found the soundness hole
This commit is contained in:
parent
63c28955aa
commit
7e743be9d8
|
@ -6,6 +6,7 @@ use std::{
|
|||
fmt::Debug,
|
||||
mem::size_of,
|
||||
ops::{Deref, DerefMut},
|
||||
ptr::NonNull,
|
||||
slice,
|
||||
vec::Vec as StdVec,
|
||||
};
|
||||
|
@ -161,15 +162,23 @@ impl<T> Deref for Vec<T> {
|
|||
type Target = [T];
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
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<T> DerefMut for Vec<T> {
|
||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||
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) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl<T: Send> Send for Vec<T> {}
|
||||
unsafe impl<T: Sync> Sync for Vec<T> {}
|
||||
|
|
Loading…
Reference in a new issue