diff options
Diffstat (limited to 'vendor/rustix/src/backend/libc/net/msghdr.rs')
-rw-r--r-- | vendor/rustix/src/backend/libc/net/msghdr.rs | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/vendor/rustix/src/backend/libc/net/msghdr.rs b/vendor/rustix/src/backend/libc/net/msghdr.rs index e3f873747..2ccd7f20c 100644 --- a/vendor/rustix/src/backend/libc/net/msghdr.rs +++ b/vendor/rustix/src/backend/libc/net/msghdr.rs @@ -24,7 +24,7 @@ pub(crate) fn with_recv_msghdr<R>( let namelen = size_of::<c::sockaddr_storage>() as c::socklen_t; let mut msghdr = { - let mut h: c::msghdr = unsafe { zeroed() }; + let mut h = zero_msghdr(); h.msg_name = name.as_mut_ptr().cast(); h.msg_namelen = namelen; h.msg_iov = iov.as_mut_ptr().cast(); @@ -53,7 +53,7 @@ pub(crate) fn with_noaddr_msghdr<R>( f: impl FnOnce(c::msghdr) -> R, ) -> R { f({ - let mut h: c::msghdr = unsafe { zeroed() }; + let mut h = zero_msghdr(); h.msg_iov = iov.as_ptr() as _; h.msg_iovlen = msg_iov_len(iov.len()); h.msg_control = control.as_control_ptr().cast(); @@ -69,10 +69,10 @@ pub(crate) fn with_v4_msghdr<R>( control: &mut SendAncillaryBuffer<'_, '_, '_>, f: impl FnOnce(c::msghdr) -> R, ) -> R { - let encoded = unsafe { encode_sockaddr_v4(addr) }; + let encoded = encode_sockaddr_v4(addr); f({ - let mut h: c::msghdr = unsafe { zeroed() }; + let mut h = zero_msghdr(); h.msg_name = as_ptr(&encoded) as _; h.msg_namelen = size_of::<SocketAddrV4>() as _; h.msg_iov = iov.as_ptr() as _; @@ -90,10 +90,10 @@ pub(crate) fn with_v6_msghdr<R>( control: &mut SendAncillaryBuffer<'_, '_, '_>, f: impl FnOnce(c::msghdr) -> R, ) -> R { - let encoded = unsafe { encode_sockaddr_v6(addr) }; + let encoded = encode_sockaddr_v6(addr); f({ - let mut h: c::msghdr = unsafe { zeroed() }; + let mut h = zero_msghdr(); h.msg_name = as_ptr(&encoded) as _; h.msg_namelen = size_of::<SocketAddrV6>() as _; h.msg_iov = iov.as_ptr() as _; @@ -113,7 +113,7 @@ pub(crate) fn with_unix_msghdr<R>( f: impl FnOnce(c::msghdr) -> R, ) -> R { f({ - let mut h: c::msghdr = unsafe { zeroed() }; + let mut h = zero_msghdr(); h.msg_name = as_ptr(addr) as _; h.msg_namelen = addr.addr_len(); h.msg_iov = iov.as_ptr() as _; @@ -123,3 +123,12 @@ pub(crate) fn with_unix_msghdr<R>( h }) } + +/// Create a zero-initialized message header struct value. +#[cfg(all(unix, not(target_os = "redox")))] +pub(crate) fn zero_msghdr() -> c::msghdr { + // SAFETY: We can't initialize all the fields by value because on some + // platforms the `msghdr` struct in the libc crate contains private padding + // fields. But it is still a C type that's meant to be zero-initializable. + unsafe { zeroed() } +} |