diff options
| author | bors <bors@rust-lang.org> | 2020-12-11 07:54:35 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-12-11 07:54:35 +0000 |
| commit | a2e29d67c26bdf8f278c98ee02d6cc77a279ed2e (patch) | |
| tree | 6887e0e4ff6c805e0e0a7cf0f715e028d98bccc8 | |
| parent | 65d053ab74d8c8c9c502b678acc265f3d7e2ac49 (diff) | |
| parent | 594b451ccc65329a3f5e60f5b6690bcd0f7e9e7b (diff) | |
| download | rust-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.rs | 11 |
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, } } |
