about summary refs log tree commit diff
path: root/src/libcore/task
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2018-07-24 09:49:58 +0800
committerGitHub <noreply@github.com>2018-07-24 09:49:58 +0800
commitb3c9fe2537b528424333d10e5fc491a0fa050dc2 (patch)
treec31cfe45abe4668f7e08482f046eecb49e023492 /src/libcore/task
parent3af372ad574bb952f728f18ac7262f1dc6503864 (diff)
parent89495f3ca33b8a236ee8bc4f89a64a500fe2391f (diff)
downloadrust-b3c9fe2537b528424333d10e5fc491a0fa050dc2.tar.gz
rust-b3c9fe2537b528424333d10e5fc491a0fa050dc2.zip
Rollup merge of #52640 - Thomasdezeeuw:fix-localwaker-clone, r=cramertj
Forget Waker when cloning LocalWaker

Since NonNull is Copy the inner field of the cloned Waker was copied for
use in the new LocalWaker, however this left Waker to be dropped. Which
means that when cloning LocalWaker would also erroneously call drop_raw.

This change forgets the Waker, rather then dropping it, leaving the
inner field to be used by the returned LocalWaker.

Closes #52629.
Diffstat (limited to 'src/libcore/task')
-rw-r--r--src/libcore/task/wake.rs9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/libcore/task/wake.rs b/src/libcore/task/wake.rs
index d3df8b50ee2..3b901c9aef0 100644
--- a/src/libcore/task/wake.rs
+++ b/src/libcore/task/wake.rs
@@ -12,7 +12,7 @@
             reason = "futures in libcore are unstable",
             issue = "50547")]
 
-use fmt;
+use {fmt, mem};
 use marker::Unpin;
 use ptr::NonNull;
 
@@ -166,9 +166,10 @@ impl From<LocalWaker> for Waker {
 impl Clone for LocalWaker {
     #[inline]
     fn clone(&self) -> Self {
-        unsafe {
-            LocalWaker { inner: self.inner.as_ref().clone_raw().inner }
-        }
+        let waker = unsafe { self.inner.as_ref().clone_raw() };
+        let inner = waker.inner;
+        mem::forget(waker);
+        LocalWaker { inner }
     }
 }