@@ -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
16941698unsafe 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
17251722fn 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