From 0aa68a8db9dfffb2756279cc621b1b15a896423d Mon Sep 17 00:00:00 2001 From: Giacomo Stevanato Date: Wed, 20 Oct 2021 15:42:54 +0200 Subject: [PATCH] Prevent invalid values from existing in Vec::swap_remove --- library/alloc/src/vec/mod.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/library/alloc/src/vec/mod.rs b/library/alloc/src/vec/mod.rs index 20a16869cb3..d52c78eedf3 100644 --- a/library/alloc/src/vec/mod.rs +++ b/library/alloc/src/vec/mod.rs @@ -1305,10 +1305,11 @@ fn assert_failed(index: usize, len: usize) -> ! { // We replace self[index] with the last element. Note that if the // bounds check above succeeds there must be a last element (which // can be self[index] itself). - let last = ptr::read(self.as_ptr().add(len - 1)); - let hole = self.as_mut_ptr().add(index); + let value = ptr::read(self.as_ptr().add(index)); + let base_ptr = self.as_mut_ptr(); + ptr::copy(base_ptr.add(len - 1), base_ptr.add(index), 1); self.set_len(len - 1); - ptr::replace(hole, last) + value } } -- 2.44.0