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