Rollup merge of #91797 - the8472:fix-invalid-deref, r=Mark-Simulacrum
Fix zero-sized reference to deallocated memory fixes #91772 r? `@camelid`
This commit is contained in:
commit
9aade508d5
1 changed files with 6 additions and 4 deletions
|
@ -128,10 +128,6 @@ impl<T, A: Allocator> Drop for Drain<'_, T, A> {
|
|||
|
||||
let iter = mem::replace(&mut self.iter, (&mut []).iter());
|
||||
let drop_len = iter.len();
|
||||
let drop_ptr = iter.as_slice().as_ptr();
|
||||
|
||||
// forget iter so there's no aliasing reference
|
||||
drop(iter);
|
||||
|
||||
let mut vec = self.vec;
|
||||
|
||||
|
@ -155,6 +151,12 @@ impl<T, A: Allocator> Drop for Drain<'_, T, A> {
|
|||
return;
|
||||
}
|
||||
|
||||
// as_slice() must only be called when iter.len() is > 0 because
|
||||
// vec::Splice modifies vec::Drain fields and may grow the vec which would invalidate
|
||||
// the iterator's internal pointers. Creating a reference to deallocated memory
|
||||
// is invalid even when it is zero-length
|
||||
let drop_ptr = iter.as_slice().as_ptr();
|
||||
|
||||
unsafe {
|
||||
// drop_ptr comes from a slice::Iter which only gives us a &[T] but for drop_in_place
|
||||
// a pointer with mutable provenance is necessary. Therefore we must reconstruct
|
||||
|
|
Loading…
Add table
Reference in a new issue