Skip to content

Commit a8aeb46

Browse files
committed
pack_mhdr_to_receive: pass pointer and capacity directly
This is already an unsafe function, dealing with pointers directly does not make it much more unsafe but simplifies lifetimes later on and similar to a previous commit allows to alocate a single buffer to store all the control messages
1 parent 22fc21b commit a8aeb46

File tree

1 file changed

+27
-27
lines changed

1 file changed

+27
-27
lines changed

src/sys/socket/mod.rs

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,10 +1573,14 @@ pub fn recvmmsg<'a, I, S>(
15731573
.into_boxed_slice();
15741574

15751575
let results: Vec<_> = iter.enumerate().map(|(i, d)| {
1576-
let (msg_controllen, mhdr) = unsafe {
1577-
pack_mhdr_to_receive(
1576+
let (msg_control, msg_controllen) = d.cmsg_buffer.as_mut()
1577+
.map(|v| (v.as_mut_ptr(), v.capacity()))
1578+
.unwrap_or((ptr::null_mut(), 0));
1579+
let mhdr = unsafe {
1580+
pack_mhdr_to_receive(
15781581
d.iov.as_ref(),
1579-
&mut d.cmsg_buffer,
1582+
msg_control,
1583+
msg_controllen,
15801584
addresses[i].as_mut_ptr(),
15811585
)
15821586
};
@@ -1648,33 +1652,26 @@ unsafe fn read_mhdr<'a, S>(
16481652

16491653
unsafe fn pack_mhdr_to_receive<'outer, 'inner, I, S>(
16501654
iov: I,
1651-
cmsg_buffer: &mut Option<&mut Vec<u8>>,
1655+
cmsg_buffer: *const u8,
1656+
cmsg_capacity: usize,
16521657
address: *mut S,
1653-
) -> (usize, msghdr)
1658+
) -> msghdr
16541659
where
16551660
I: AsRef<[IoSliceMut<'inner>]> + 'outer,
16561661
S: SockaddrLike + 'outer
16571662
{
1658-
let (msg_control, msg_controllen) = cmsg_buffer.as_mut()
1659-
.map(|v| (v.as_mut_ptr(), v.capacity()))
1660-
.unwrap_or((ptr::null_mut(), 0));
1661-
1662-
let mhdr = {
1663-
// Musl's msghdr has private fields, so this is the only way to
1664-
// initialize it.
1665-
let mut mhdr = mem::MaybeUninit::<msghdr>::zeroed();
1666-
let p = mhdr.as_mut_ptr();
1667-
(*p).msg_name = (*address).as_mut_ptr() as *mut c_void;
1668-
(*p).msg_namelen = S::size();
1669-
(*p).msg_iov = iov.as_ref().as_ptr() as *mut iovec;
1670-
(*p).msg_iovlen = iov.as_ref().len() as _;
1671-
(*p).msg_control = msg_control as *mut c_void;
1672-
(*p).msg_controllen = msg_controllen as _;
1673-
(*p).msg_flags = 0;
1674-
mhdr.assume_init()
1675-
};
1676-
1677-
(msg_controllen, mhdr)
1663+
// Musl's msghdr has private fields, so this is the only way to
1664+
// initialize it.
1665+
let mut mhdr = mem::MaybeUninit::<msghdr>::zeroed();
1666+
let p = mhdr.as_mut_ptr();
1667+
(*p).msg_name = (*address).as_mut_ptr() as *mut c_void;
1668+
(*p).msg_namelen = S::size();
1669+
(*p).msg_iov = iov.as_ref().as_ptr() as *mut iovec;
1670+
(*p).msg_iovlen = iov.as_ref().len() as _;
1671+
(*p).msg_control = cmsg_buffer as *mut c_void;
1672+
(*p).msg_controllen = cmsg_capacity as _;
1673+
(*p).msg_flags = 0;
1674+
mhdr.assume_init()
16781675
}
16791676

16801677
fn pack_mhdr_to_send<'a, I, C, S>(
@@ -1751,8 +1748,11 @@ pub fn recvmsg<'a, 'outer, 'inner, S>(fd: RawFd, iov: &'outer mut [IoSliceMut<'i
17511748
{
17521749
let mut address = mem::MaybeUninit::uninit();
17531750

1754-
let (msg_controllen, mut mhdr) = unsafe {
1755-
pack_mhdr_to_receive::<_, S>(iov, &mut cmsg_buffer, address.as_mut_ptr())
1751+
let (msg_control, msg_controllen) = cmsg_buffer.as_mut()
1752+
.map(|v| (v.as_mut_ptr(), v.capacity()))
1753+
.unwrap_or((ptr::null_mut(), 0));
1754+
let mut mhdr = unsafe {
1755+
pack_mhdr_to_receive::<_, S>(iov, msg_control, msg_controllen, address.as_mut_ptr())
17561756
};
17571757

17581758
let ret = unsafe { libc::recvmsg(fd, &mut mhdr, flags.bits()) };

0 commit comments

Comments
 (0)