Skip to content

Commit dd1d4fd

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 482a6b1 commit dd1d4fd

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
@@ -1616,10 +1616,14 @@ pub fn recvmmsg<'a, I, S>(
16161616
.into_boxed_slice();
16171617

16181618
let results: Vec<_> = iter.enumerate().map(|(i, d)| {
1619-
let (msg_controllen, mhdr) = unsafe {
1620-
pack_mhdr_to_receive(
1619+
let (msg_control, msg_controllen) = d.cmsg_buffer.as_mut()
1620+
.map(|v| (v.as_mut_ptr(), v.capacity()))
1621+
.unwrap_or((ptr::null_mut(), 0));
1622+
let mhdr = unsafe {
1623+
pack_mhdr_to_receive(
16211624
d.iov.as_ref(),
1622-
&mut d.cmsg_buffer,
1625+
msg_control,
1626+
msg_controllen,
16231627
addresses[i].as_mut_ptr(),
16241628
)
16251629
};
@@ -1693,33 +1697,26 @@ unsafe fn read_mhdr<'a, S>(
16931697

16941698
unsafe fn pack_mhdr_to_receive<'outer, 'inner, I, S>(
16951699
iov: I,
1696-
cmsg_buffer: &mut Option<&mut Vec<u8>>,
1700+
cmsg_buffer: *const u8,
1701+
cmsg_capacity: usize,
16971702
address: *mut S,
1698-
) -> (usize, msghdr)
1703+
) -> msghdr
16991704
where
17001705
I: AsRef<[IoSliceMut<'inner>]> + 'outer,
17011706
S: SockaddrLike + 'outer
17021707
{
1703-
let (msg_control, msg_controllen) = cmsg_buffer.as_mut()
1704-
.map(|v| (v.as_mut_ptr(), v.capacity()))
1705-
.unwrap_or((ptr::null_mut(), 0));
1706-
1707-
let mhdr = {
1708-
// Musl's msghdr has private fields, so this is the only way to
1709-
// initialize it.
1710-
let mut mhdr = mem::MaybeUninit::<msghdr>::zeroed();
1711-
let p = mhdr.as_mut_ptr();
1712-
(*p).msg_name = (*address).as_mut_ptr() as *mut c_void;
1713-
(*p).msg_namelen = S::size();
1714-
(*p).msg_iov = iov.as_ref().as_ptr() as *mut iovec;
1715-
(*p).msg_iovlen = iov.as_ref().len() as _;
1716-
(*p).msg_control = msg_control as *mut c_void;
1717-
(*p).msg_controllen = msg_controllen as _;
1718-
(*p).msg_flags = 0;
1719-
mhdr.assume_init()
1720-
};
1721-
1722-
(msg_controllen, mhdr)
1708+
// Musl's msghdr has private fields, so this is the only way to
1709+
// initialize it.
1710+
let mut mhdr = mem::MaybeUninit::<msghdr>::zeroed();
1711+
let p = mhdr.as_mut_ptr();
1712+
(*p).msg_name = (*address).as_mut_ptr() as *mut c_void;
1713+
(*p).msg_namelen = S::size();
1714+
(*p).msg_iov = iov.as_ref().as_ptr() as *mut iovec;
1715+
(*p).msg_iovlen = iov.as_ref().len() as _;
1716+
(*p).msg_control = cmsg_buffer as *mut c_void;
1717+
(*p).msg_controllen = cmsg_capacity as _;
1718+
(*p).msg_flags = 0;
1719+
mhdr.assume_init()
17231720
}
17241721

17251722
fn pack_mhdr_to_send<'a, I, C, S>(
@@ -1796,8 +1793,11 @@ pub fn recvmsg<'a, 'outer, 'inner, S>(fd: RawFd, iov: &'outer mut [IoSliceMut<'i
17961793
{
17971794
let mut address = mem::MaybeUninit::uninit();
17981795

1799-
let (msg_controllen, mut mhdr) = unsafe {
1800-
pack_mhdr_to_receive::<_, S>(iov, &mut cmsg_buffer, address.as_mut_ptr())
1796+
let (msg_control, msg_controllen) = cmsg_buffer.as_mut()
1797+
.map(|v| (v.as_mut_ptr(), v.capacity()))
1798+
.unwrap_or((ptr::null_mut(), 0));
1799+
let mut mhdr = unsafe {
1800+
pack_mhdr_to_receive::<_, S>(iov, msg_control, msg_controllen, address.as_mut_ptr())
18011801
};
18021802

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

0 commit comments

Comments
 (0)