From b911157579a4259ca20a38e1b1b17514752b139e Mon Sep 17 00:00:00 2001 From: Ben Kimock Date: Fri, 4 Feb 2022 20:17:26 -0500 Subject: [PATCH] Don't call assume_init on Deferred's Data In the crossbeam-deque test suite, a Deferred is created from a FnOnce which is smaller than the Data. This makes the call to assume_init() immediate UB (the reference to it created upon call is probably UB too). Since Data doesn't have a Drop impl, we can just leave it in the MaybeUninit wrapper. --- crossbeam-epoch/src/deferred.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crossbeam-epoch/src/deferred.rs b/crossbeam-epoch/src/deferred.rs index 741d8c82a..7ec8f6d2e 100644 --- a/crossbeam-epoch/src/deferred.rs +++ b/crossbeam-epoch/src/deferred.rs @@ -18,7 +18,7 @@ type Data = [usize; DATA_WORDS]; /// This is a handy way of keeping an unsized `FnOnce()` within a sized structure. pub(crate) struct Deferred { call: unsafe fn(*mut u8), - data: Data, + data: MaybeUninit, _marker: PhantomData<*mut ()>, // !Send + !Sync } @@ -46,7 +46,7 @@ impl Deferred { Deferred { call: call::, - data: data.assume_init(), + data, _marker: PhantomData, } } else { @@ -64,7 +64,7 @@ impl Deferred { Deferred { call: call::, - data: data.assume_init(), + data, _marker: PhantomData, } } @@ -75,7 +75,7 @@ impl Deferred { #[inline] pub(crate) fn call(mut self) { let call = self.call; - unsafe { call(&mut self.data as *mut Data as *mut u8) }; + unsafe { call(self.data.as_mut_ptr() as *mut u8) }; } }