Skip to content

Commit 86cb43d

Browse files
xizheyingitbot
authored and
gitbot
committed
Replace mem::zeroed with mem::MaybeUninit::uninit for large struct in unix
Signed-off-by: xizheyin <xizheyin@smail.nju.edu.cn>
1 parent 50431f2 commit 86cb43d

File tree

4 files changed

+31
-13
lines changed

4 files changed

+31
-13
lines changed

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

+6-3
Original file line numberDiff line numberDiff line change
@@ -557,10 +557,13 @@ impl TcpListener {
557557
}
558558

559559
pub fn accept(&self) -> io::Result<(TcpStream, SocketAddr)> {
560-
let mut storage: c::sockaddr_storage = unsafe { mem::zeroed() };
560+
// The `accept` function will fill in the storage with the address,
561+
// so we don't need to zero it here.
562+
// reference: https://linux.die.net/man/2/accept4
563+
let mut storage: mem::MaybeUninit<c::sockaddr_storage> = mem::MaybeUninit::uninit();
561564
let mut len = mem::size_of_val(&storage) as c::socklen_t;
562-
let sock = self.inner.accept((&raw mut storage) as *mut _, &mut len)?;
563-
let addr = unsafe { socket_addr_from_c(&storage, len as usize)? };
565+
let sock = self.inner.accept(storage.as_mut_ptr() as *mut _, &mut len)?;
566+
let addr = unsafe { socket_addr_from_c(storage.as_ptr(), len as usize)? };
564567
Ok((TcpStream { inner: sock }, addr))
565568
}
566569

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

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

328331
let n = cvt(unsafe {
@@ -335,7 +338,7 @@ impl Socket {
335338
&mut addrlen,
336339
)
337340
})?;
338-
Ok((n as usize, unsafe { socket_addr_from_c(&storage, addrlen as usize)? }))
341+
Ok((n as usize, unsafe { socket_addr_from_c(storage.as_ptr(), addrlen as usize)? }))
339342
}
340343

341344
pub fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {

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"))]

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)