Skip to content

Commit f701add

Browse files
committed
Replace mem::zeroed with mem::MaybeUninit::uninit for large struct in unix
Signed-off-by: xizheyin <[email protected]>
1 parent 8c04e39 commit f701add

File tree

4 files changed

+30
-10
lines changed

4 files changed

+30
-10
lines changed

library/std/src/sys/net/connection/socket.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -470,9 +470,13 @@ impl TcpListener {
470470
}
471471

472472
pub fn accept(&self) -> io::Result<(TcpStream, SocketAddr)> {
473-
let mut storage: c::sockaddr_storage = unsafe { mem::zeroed() };
473+
// The `accept` function will fill in the storage with the address,
474+
// so we don't need to zero it here.
475+
// reference: https://linux.die.net/man/2/accept4
476+
let mut storage: mem::MaybeUninit<c::sockaddr_storage> = mem::MaybeUninit::uninit();
474477
let mut len = mem::size_of_val(&storage) as c::socklen_t;
475478
let sock = self.inner.accept((&raw mut storage) as *mut _, &mut len)?;
479+
let storage = unsafe { storage.assume_init() };
476480
let addr = sockaddr_to_addr(&storage, len as usize)?;
477481
Ok((TcpStream { inner: sock }, addr))
478482
}

library/std/src/sys/net/connection/socket/unix.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,10 @@ impl Socket {
321321
buf: &mut [u8],
322322
flags: c_int,
323323
) -> io::Result<(usize, SocketAddr)> {
324-
let mut storage: libc::sockaddr_storage = unsafe { mem::zeroed() };
324+
// The `recvfrom` function will fill in the storage with the address,
325+
// so we don't need to zero it here.
326+
// reference: https://linux.die.net/man/2/recvfrom
327+
let mut storage: mem::MaybeUninit<libc::sockaddr_storage> = mem::MaybeUninit::uninit();
325328
let mut addrlen = mem::size_of_val(&storage) as libc::socklen_t;
326329

327330
let n = cvt(unsafe {
@@ -334,6 +337,7 @@ impl Socket {
334337
&mut addrlen,
335338
)
336339
})?;
340+
let storage = unsafe { storage.assume_init() };
337341
Ok((n as usize, sockaddr_to_addr(&storage, addrlen as usize)?))
338342
}
339343

library/std/src/sys/pal/unix/stack_overflow.rs

+17-6
Original file line numberDiff line numberDiff line change
@@ -319,9 +319,14 @@ mod imp {
319319
))]
320320
unsafe fn get_stack_start() -> Option<*mut libc::c_void> {
321321
let mut ret = None;
322-
let mut attr: libc::pthread_attr_t = crate::mem::zeroed();
323-
#[cfg(target_os = "freebsd")]
324-
assert_eq!(libc::pthread_attr_init(&mut attr), 0);
322+
let attr: mem::MaybeUninit<libc::pthread_attr_t> = if cfg!(target_os = "freebsd") {
323+
let mut attr = mem::MaybeUninit::uninit();
324+
assert_eq!(libc::pthread_attr_init((&raw mut attr) as *mut _), 0);
325+
attr
326+
} else {
327+
mem::MaybeUninit::zeroed()
328+
};
329+
let mut attr = unsafe { attr.assume_init() };
325330
#[cfg(target_os = "freebsd")]
326331
let e = libc::pthread_attr_get_np(libc::pthread_self(), &mut attr);
327332
#[cfg(not(target_os = "freebsd"))]
@@ -509,9 +514,15 @@ mod imp {
509514
// FIXME: I am probably not unsafe.
510515
unsafe fn current_guard() -> Option<Range<usize>> {
511516
let mut ret = None;
512-
let mut attr: libc::pthread_attr_t = crate::mem::zeroed();
513-
#[cfg(target_os = "freebsd")]
514-
assert_eq!(libc::pthread_attr_init(&mut attr), 0);
517+
let attr: mem::MaybeUninit<libc::pthread_attr_t> = if cfg!(target_os = "freebsd") {
518+
let mut attr = mem::MaybeUninit::uninit();
519+
assert_eq!(libc::pthread_attr_init((&raw mut attr) as *mut _), 0);
520+
attr
521+
} else {
522+
mem::MaybeUninit::zeroed()
523+
};
524+
525+
let mut attr = unsafe { attr.assume_init() };
515526
#[cfg(target_os = "freebsd")]
516527
let e = libc::pthread_attr_get_np(libc::pthread_self(), &mut attr);
517528
#[cfg(not(target_os = "freebsd"))]

library/std/src/sys/pal/unix/thread.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@ impl Thread {
4949
pub unsafe fn new(stack: usize, p: Box<dyn FnOnce()>) -> io::Result<Thread> {
5050
let p = Box::into_raw(Box::new(p));
5151
let mut native: libc::pthread_t = mem::zeroed();
52-
let mut attr: libc::pthread_attr_t = mem::zeroed();
53-
assert_eq!(libc::pthread_attr_init(&mut attr), 0);
52+
let mut attr: mem::MaybeUninit<libc::pthread_attr_t> = mem::MaybeUninit::uninit();
53+
assert_eq!(libc::pthread_attr_init((&raw mut attr) as *mut _), 0);
54+
let mut attr: libc::pthread_attr_t = unsafe { attr.assume_init() };
5455

5556
#[cfg(target_os = "espidf")]
5657
if stack > 0 {

0 commit comments

Comments
 (0)