@@ -1573,10 +1573,14 @@ pub fn recvmmsg<'a, I, S>(
1573
1573
. into_boxed_slice( ) ;
1574
1574
1575
1575
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(
1578
1581
d. iov. as_ref( ) ,
1579
- & mut d. cmsg_buffer,
1582
+ msg_control,
1583
+ msg_controllen,
1580
1584
addresses[ i] . as_mut_ptr( ) ,
1581
1585
)
1582
1586
} ;
@@ -1648,33 +1652,26 @@ unsafe fn read_mhdr<'a, S>(
1648
1652
1649
1653
unsafe fn pack_mhdr_to_receive<' outer, ' inner, I , S >(
1650
1654
iov: I ,
1651
- cmsg_buffer: & mut Option <& mut Vec <u8 >>,
1655
+ cmsg_buffer: * const u8 ,
1656
+ cmsg_capacity: usize ,
1652
1657
address: * mut S ,
1653
- ) -> ( usize , msghdr)
1658
+ ) -> msghdr
1654
1659
where
1655
1660
I : AsRef <[ IoSliceMut <' inner>] > + ' outer,
1656
1661
S : SockaddrLike + ' outer
1657
1662
{
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( )
1678
1675
}
1679
1676
1680
1677
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
1751
1748
{
1752
1749
let mut address = mem:: MaybeUninit :: uninit( ) ;
1753
1750
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( ) )
1756
1756
} ;
1757
1757
1758
1758
let ret = unsafe { libc:: recvmsg( fd, & mut mhdr, flags. bits( ) ) } ;
0 commit comments