@@ -1609,7 +1609,7 @@ impl<S> MultiHeaders<S> {
1609
1609
{
1610
1610
// we will be storing pointers to addresses inside mhdr - convert it into boxed
1611
1611
// slice so it can'be changed later by pushing anything into self.addresses
1612
- let mut addresses = vec![ std:: mem:: MaybeUninit :: uninit( ) ; num_slices] . into_boxed_slice( ) ;
1612
+ let mut addresses = vec![ std:: mem:: MaybeUninit :: < S > :: uninit( ) ; num_slices] . into_boxed_slice( ) ;
1613
1613
1614
1614
let msg_controllen = cmsg_buffer. as_ref( ) . map_or( 0 , |v| v. capacity( ) ) ;
1615
1615
@@ -1626,7 +1626,9 @@ impl<S> MultiHeaders<S> {
1626
1626
Some ( v) => ( ( & v[ ix * msg_controllen] as * const u8 ) , msg_controllen) ,
1627
1627
None => ( std:: ptr:: null( ) , 0 ) ,
1628
1628
} ;
1629
- let msg_hdr = unsafe { pack_mhdr_to_receive( std:: ptr:: null( ) , 0 , ptr, cap, address. as_mut_ptr( ) ) } ;
1629
+ let msg_hdr = unsafe {
1630
+ pack_mhdr_to_receive( std:: ptr:: null( ) , 0 , ptr, cap, <S as addr:: private:: SockaddrLikePriv >:: as_mut_ptr( address. assume_init_mut( ) ) . cast( ) )
1631
+ } ;
1630
1632
libc:: mmsghdr {
1631
1633
msg_hdr,
1632
1634
msg_len: 0 ,
@@ -1761,7 +1763,7 @@ where
1761
1763
mmsghdr. msg_hdr,
1762
1764
mmsghdr. msg_len as isize ,
1763
1765
self . rmm. msg_controllen,
1764
- address,
1766
+ Some ( address) ,
1765
1767
)
1766
1768
} )
1767
1769
}
@@ -1914,7 +1916,7 @@ unsafe fn read_mhdr<'a, 'i, S>(
1914
1916
mhdr: msghdr,
1915
1917
r: isize ,
1916
1918
msg_controllen: usize ,
1917
- address: S ,
1919
+ address: Option < S > ,
1918
1920
) -> RecvMsg <' a, ' i, S >
1919
1921
where S : SockaddrLike
1920
1922
{
@@ -1933,7 +1935,7 @@ unsafe fn read_mhdr<'a, 'i, S>(
1933
1935
RecvMsg {
1934
1936
bytes: r as usize ,
1935
1937
cmsghdr,
1936
- address: Some ( address ) ,
1938
+ address,
1937
1939
flags: MsgFlags :: from_bits_truncate( mhdr. msg_flags) ,
1938
1940
mhdr,
1939
1941
iobufs: std:: marker:: PhantomData ,
@@ -1951,22 +1953,19 @@ unsafe fn read_mhdr<'a, 'i, S>(
1951
1953
/// headers are not used
1952
1954
///
1953
1955
/// Buffers must remain valid for the whole lifetime of msghdr
1954
- unsafe fn pack_mhdr_to_receive< S > (
1956
+ unsafe fn pack_mhdr_to_receive(
1955
1957
iov_buffer: * const IoSliceMut ,
1956
1958
iov_buffer_len: usize ,
1957
1959
cmsg_buffer: * const u8 ,
1958
1960
cmsg_capacity: usize ,
1959
- address: * mut S ,
1960
- ) -> msghdr
1961
- where
1962
- S : SockaddrLike
1963
- {
1961
+ address: * mut libc:: sockaddr_storage,
1962
+ ) -> msghdr {
1964
1963
// Musl's msghdr has private fields, so this is the only way to
1965
1964
// initialize it.
1966
1965
let mut mhdr = mem:: MaybeUninit :: <msghdr>:: zeroed( ) ;
1967
1966
let p = mhdr. as_mut_ptr( ) ;
1968
- ( * p) . msg_name = ( * address) . as_mut_ptr ( ) as * mut c_void;
1969
- ( * p) . msg_namelen = S :: size ( ) ;
1967
+ ( * p) . msg_name = address as * mut c_void;
1968
+ ( * p) . msg_namelen = mem :: size_of :: <libc :: sockaddr_storage> ( ) as u32 ;
1970
1969
( * p) . msg_iov = iov_buffer as * mut iovec;
1971
1970
( * p) . msg_iovlen = iov_buffer_len as _;
1972
1971
( * p) . msg_control = cmsg_buffer as * mut c_void;
@@ -2048,20 +2047,23 @@ pub fn recvmsg<'a, 'outer, 'inner, S>(fd: RawFd, iov: &'outer mut [IoSliceMut<'i
2048
2047
where S : SockaddrLike + ' a,
2049
2048
' inner: ' outer
2050
2049
{
2051
- let mut address = mem:: MaybeUninit :: uninit( ) ;
2050
+ let mut address: libc:: sockaddr_storage = unsafe { mem:: MaybeUninit :: zeroed( ) . assume_init( ) } ;
2051
+ let address_ptr: * mut libc:: sockaddr_storage = & mut address as * mut libc:: sockaddr_storage;
2052
2052
2053
2053
let ( msg_control, msg_controllen) = cmsg_buffer. as_mut( )
2054
2054
. map( |v| ( v. as_mut_ptr( ) , v. capacity( ) ) )
2055
2055
. unwrap_or( ( ptr:: null_mut( ) , 0 ) ) ;
2056
2056
let mut mhdr = unsafe {
2057
- pack_mhdr_to_receive( iov. as_ref( ) . as_ptr( ) , iov. len( ) , msg_control, msg_controllen, address . as_mut_ptr ( ) )
2057
+ pack_mhdr_to_receive( iov. as_ref( ) . as_ptr( ) , iov. len( ) , msg_control, msg_controllen, address_ptr )
2058
2058
} ;
2059
2059
2060
2060
let ret = unsafe { libc:: recvmsg( fd, & mut mhdr, flags. bits( ) ) } ;
2061
2061
2062
2062
let r = Errno :: result( ret) ?;
2063
2063
2064
- Ok ( unsafe { read_mhdr( mhdr, r, msg_controllen, address. assume_init( ) ) } )
2064
+ let address = unsafe { S :: from_raw( address_ptr. cast:: <libc:: sockaddr>( ) , Some ( mhdr. msg_namelen) ) } ;
2065
+
2066
+ Ok ( unsafe { read_mhdr( mhdr, r, msg_controllen, address) } )
2065
2067
}
2066
2068
}
2067
2069
0 commit comments