@@ -1616,10 +1616,14 @@ pub fn recvmmsg<'a, I, S>(
1616
1616
. into_boxed_slice( ) ;
1617
1617
1618
1618
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(
1621
1624
d. iov. as_ref( ) ,
1622
- & mut d. cmsg_buffer,
1625
+ msg_control,
1626
+ msg_controllen,
1623
1627
addresses[ i] . as_mut_ptr( ) ,
1624
1628
)
1625
1629
} ;
@@ -1693,33 +1697,26 @@ unsafe fn read_mhdr<'a, S>(
1693
1697
1694
1698
unsafe fn pack_mhdr_to_receive<' outer, ' inner, I , S >(
1695
1699
iov: I ,
1696
- cmsg_buffer: & mut Option <& mut Vec <u8 >>,
1700
+ cmsg_buffer: * const u8 ,
1701
+ cmsg_capacity: usize ,
1697
1702
address: * mut S ,
1698
- ) -> ( usize , msghdr)
1703
+ ) -> msghdr
1699
1704
where
1700
1705
I : AsRef <[ IoSliceMut <' inner>] > + ' outer,
1701
1706
S : SockaddrLike + ' outer
1702
1707
{
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( )
1723
1720
}
1724
1721
1725
1722
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
1796
1793
{
1797
1794
let mut address = mem:: MaybeUninit :: uninit( ) ;
1798
1795
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( ) )
1801
1801
} ;
1802
1802
1803
1803
let ret = unsafe { libc:: recvmsg( fd, & mut mhdr, flags. bits( ) ) } ;
0 commit comments