From: Giacomo Stevanato Date: Wed, 20 Oct 2021 13:42:54 +0000 (+0200) Subject: Prevent invalid values from existing in Vec::swap_remove X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=0aa68a8db9dfffb2756279cc621b1b15a896423d;hp=6162529a01473bbb2427fa27354cbafc3c514eee;p=rust.git Prevent invalid values from existing in Vec::swap_remove --- 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 } }