about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2020-12-11 07:54:35 +0000
committerbors <bors@rust-lang.org>2020-12-11 07:54:35 +0000
commita2e29d67c26bdf8f278c98ee02d6cc77a279ed2e (patch)
tree6887e0e4ff6c805e0e0a7cf0f715e028d98bccc8
parent65d053ab74d8c8c9c502b678acc265f3d7e2ac49 (diff)
parent594b451ccc65329a3f5e60f5b6690bcd0f7e9e7b (diff)
downloadrust-a2e29d67c26bdf8f278c98ee02d6cc77a279ed2e.tar.gz
rust-a2e29d67c26bdf8f278c98ee02d6cc77a279ed2e.zip
Auto merge of #79893 - RalfJung:forget-windows, r=oli-obk
Windows TLS: ManuallyDrop instead of mem::forget

The Windows TLS implementation still used `mem::forget` instead of `ManuallyDrop`, leading to the usual problem of "using" the `Box` when it should not be used any more.
-rw-r--r--library/std/src/sys/windows/thread_local_key.rs11
1 files changed, 4 insertions, 7 deletions
diff --git a/library/std/src/sys/windows/thread_local_key.rs b/library/std/src/sys/windows/thread_local_key.rs
index fb2bb0613ee..065365e5572 100644
--- a/library/std/src/sys/windows/thread_local_key.rs
+++ b/library/std/src/sys/windows/thread_local_key.rs
@@ -1,4 +1,4 @@
-use crate::mem;
+use crate::mem::ManuallyDrop;
 use crate::ptr;
 use crate::sync::atomic::AtomicPtr;
 use crate::sync::atomic::Ordering::SeqCst;
@@ -111,16 +111,13 @@ struct Node {
 }
 
 unsafe fn register_dtor(key: Key, dtor: Dtor) {
-    let mut node = Box::new(Node { key, dtor, next: ptr::null_mut() });
+    let mut node = ManuallyDrop::new(Box::new(Node { key, dtor, next: ptr::null_mut() }));
 
     let mut head = DTORS.load(SeqCst);
     loop {
         node.next = head;
-        match DTORS.compare_exchange(head, &mut *node, SeqCst, SeqCst) {
-            Ok(_) => {
-                mem::forget(node);
-                return;
-            }
+        match DTORS.compare_exchange(head, &mut **node, SeqCst, SeqCst) {
+            Ok(_) => return, // nothing to drop, we successfully added the node to the list
             Err(cur) => head = cur,
         }
     }