summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas de Zeeuw <thomasdezeeuw@gmail.com>2018-07-23 13:39:21 +0200
committerThomas de Zeeuw <thomasdezeeuw@gmail.com>2018-07-23 13:45:25 +0200
commit89495f3ca33b8a236ee8bc4f89a64a500fe2391f (patch)
treee6f5f33aaced37a1c7b15f852b5c415cf280ce29
parent3b7720399a9006d9d7b89c251fa37ead46f9db7a (diff)
downloadrust-89495f3ca33b8a236ee8bc4f89a64a500fe2391f.tar.gz
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.
-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 }
}
}