Skip to content

Commit d600ddd

Browse files
committed
pack_mhdr_to_receive: pass iovec ptr and capacity separately
We'll be using that to reinitialize buffers later
1 parent dd1d4fd commit d600ddd

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

src/sys/socket/mod.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,7 +1621,8 @@ pub fn recvmmsg<'a, I, S>(
16211621
.unwrap_or((ptr::null_mut(), 0));
16221622
let mhdr = unsafe {
16231623
pack_mhdr_to_receive(
1624-
d.iov.as_ref(),
1624+
d.iov.as_ref().as_ptr(),
1625+
d.iov.as_ref().len(),
16251626
msg_control,
16261627
msg_controllen,
16271628
addresses[i].as_mut_ptr(),
@@ -1695,24 +1696,24 @@ unsafe fn read_mhdr<'a, S>(
16951696
}
16961697
}
16971698

1698-
unsafe fn pack_mhdr_to_receive<'outer, 'inner, I, S>(
1699-
iov: I,
1699+
unsafe fn pack_mhdr_to_receive<S>(
1700+
iov_buffer: *const IoSliceMut,
1701+
iov_buffer_len: usize,
17001702
cmsg_buffer: *const u8,
17011703
cmsg_capacity: usize,
17021704
address: *mut S,
17031705
) -> msghdr
17041706
where
1705-
I: AsRef<[IoSliceMut<'inner>]> + 'outer,
1706-
S: SockaddrLike + 'outer
1707+
S: SockaddrLike
17071708
{
17081709
// Musl's msghdr has private fields, so this is the only way to
17091710
// initialize it.
17101711
let mut mhdr = mem::MaybeUninit::<msghdr>::zeroed();
17111712
let p = mhdr.as_mut_ptr();
17121713
(*p).msg_name = (*address).as_mut_ptr() as *mut c_void;
17131714
(*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 _;
1715+
(*p).msg_iov = iov_buffer as *mut iovec;
1716+
(*p).msg_iovlen = iov_buffer_len as _;
17161717
(*p).msg_control = cmsg_buffer as *mut c_void;
17171718
(*p).msg_controllen = cmsg_capacity as _;
17181719
(*p).msg_flags = 0;
@@ -1797,7 +1798,7 @@ pub fn recvmsg<'a, 'outer, 'inner, S>(fd: RawFd, iov: &'outer mut [IoSliceMut<'i
17971798
.map(|v| (v.as_mut_ptr(), v.capacity()))
17981799
.unwrap_or((ptr::null_mut(), 0));
17991800
let mut mhdr = unsafe {
1800-
pack_mhdr_to_receive::<_, S>(iov, msg_control, msg_controllen, address.as_mut_ptr())
1801+
pack_mhdr_to_receive(iov.as_ref().as_ptr(), iov.len(), msg_control, msg_controllen, address.as_mut_ptr())
18011802
};
18021803

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

0 commit comments

Comments
 (0)