about summary refs log tree commit diff
path: root/library/alloc/src/vec
diff options
context:
space:
mode:
authorGiacomo Stevanato <giaco.stevanato@gmail.com>2021-05-24 12:41:13 +0200
committerGiacomo Stevanato <giaco.stevanato@gmail.com>2021-05-24 12:41:13 +0200
commite0c97196724d82335ee0dbb07cb3f3166f91c009 (patch)
treedd208e250a1392ed2d56b5307f7d327fd1360d55 /library/alloc/src/vec
parent13bf0b2a3cc38ba9ed9a1542d8f2a7e98059a8aa (diff)
downloadrust-e0c97196724d82335ee0dbb07cb3f3166f91c009.tar.gz
rust-e0c97196724d82335ee0dbb07cb3f3166f91c009.zip
Avoid a double drop in Vec::dedup if a destructor panics
Diffstat (limited to 'library/alloc/src/vec')
-rw-r--r--library/alloc/src/vec/mod.rs5
1 files changed, 3 insertions, 2 deletions
diff --git a/library/alloc/src/vec/mod.rs b/library/alloc/src/vec/mod.rs
index 1c33ff555d6..105c60e7bf0 100644
--- a/library/alloc/src/vec/mod.rs
+++ b/library/alloc/src/vec/mod.rs
@@ -1619,6 +1619,8 @@ impl<T, A: Allocator> Vec<T, A> {
                 let prev_ptr = ptr.add(gap.write.wrapping_sub(1));
 
                 if same_bucket(&mut *read_ptr, &mut *prev_ptr) {
+                    // Increase `gap.read` now since the drop may panic.
+                    gap.read += 1;
                     /* We have found duplicate, drop it in-place */
                     ptr::drop_in_place(read_ptr);
                 } else {
@@ -1631,9 +1633,8 @@ impl<T, A: Allocator> Vec<T, A> {
 
                     /* We have filled that place, so go further */
                     gap.write += 1;
+                    gap.read += 1;
                 }
-
-                gap.read += 1;
             }
 
             /* Technically we could let `gap` clean up with its Drop, but