Skip to content

Commit 548ef76

Browse files
committed
Fixed nightly panic caused by zero-length invalid pointer
1 parent 9683f51 commit 548ef76

1 file changed

Lines changed: 5 additions & 4 deletions

File tree

epserde/src/deser/helpers.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use super::{read::*, DeserializeInner};
1616
use crate::deser;
1717
use crate::traits::*;
1818
use core::mem::MaybeUninit;
19+
use core::ptr::NonNull;
1920

2021
/// Full-copy deserialize a zero-copy structure.
2122
///
@@ -85,10 +86,10 @@ pub unsafe fn deserialize_eps_zero<'a, T: ZeroCopy>(
8586
) -> deser::Result<&'a T> {
8687
let bytes = core::mem::size_of::<T>();
8788
if bytes == 0 {
88-
// SAFETY: T is zero-sized and `assume_init` is safe.
89+
// SAFETY: T is zero-sized (see the from_raw_parts docs)
8990
#[allow(invalid_value)]
9091
#[allow(clippy::uninit_assumed_init)]
91-
return Ok(unsafe { MaybeUninit::uninit().assume_init() });
92+
return Ok(unsafe { NonNull::<T>::dangling().as_ref() });
9293
}
9394
backend.align::<T>()?;
9495
let (pre, data, after) = unsafe { backend.data[..bytes].align_to::<T>() };
@@ -111,10 +112,10 @@ pub unsafe fn deserialize_eps_slice_zero<'a, T: ZeroCopy>(
111112
let len = usize::_deserialize_full_inner(backend)?;
112113
let bytes = len * core::mem::size_of::<T>();
113114
if core::mem::size_of::<T>() == 0 {
114-
// SAFETY: T is zero-sized and `assume_init` is safe.
115+
// SAFETY: T is zero-sized (see the from_raw_parts docs)
115116
#[allow(invalid_value)]
116117
#[allow(clippy::uninit_assumed_init)]
117-
return Ok(unsafe { std::slice::from_raw_parts(MaybeUninit::uninit().assume_init(), len) });
118+
return Ok(unsafe { std::slice::from_raw_parts(NonNull::dangling().as_ref(), len) });
118119
}
119120
backend.align::<T>()?;
120121
let (pre, data, after) = unsafe { backend.data[..bytes].align_to::<T>() };

0 commit comments

Comments
 (0)