Skip to content

Commit 905c23e

Browse files
committed
Set the length of a sockaddr received on Linux
1 parent b13b7d1 commit 905c23e

File tree

2 files changed

+19
-17
lines changed

2 files changed

+19
-17
lines changed

src/sys/socket/addr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1679,7 +1679,7 @@ impl PartialEq for SockaddrStorage {
16791679
}
16801680
}
16811681

1682-
mod private {
1682+
pub(super) mod private {
16831683
pub trait SockaddrLikePriv {
16841684
/// Returns a mutable raw pointer to the inner structure.
16851685
///

src/sys/socket/mod.rs

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,7 +1609,7 @@ impl<S> MultiHeaders<S> {
16091609
{
16101610
// we will be storing pointers to addresses inside mhdr - convert it into boxed
16111611
// 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();
16131613

16141614
let msg_controllen = cmsg_buffer.as_ref().map_or(0, |v| v.capacity());
16151615

@@ -1626,7 +1626,9 @@ impl<S> MultiHeaders<S> {
16261626
Some(v) => ((&v[ix * msg_controllen] as *const u8), msg_controllen),
16271627
None => (std::ptr::null(), 0),
16281628
};
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+
};
16301632
libc::mmsghdr {
16311633
msg_hdr,
16321634
msg_len: 0,
@@ -1761,7 +1763,7 @@ where
17611763
mmsghdr.msg_hdr,
17621764
mmsghdr.msg_len as isize,
17631765
self.rmm.msg_controllen,
1764-
address,
1766+
Some(address),
17651767
)
17661768
})
17671769
}
@@ -1914,7 +1916,7 @@ unsafe fn read_mhdr<'a, 'i, S>(
19141916
mhdr: msghdr,
19151917
r: isize,
19161918
msg_controllen: usize,
1917-
address: S,
1919+
address: Option<S>,
19181920
) -> RecvMsg<'a, 'i, S>
19191921
where S: SockaddrLike
19201922
{
@@ -1933,7 +1935,7 @@ unsafe fn read_mhdr<'a, 'i, S>(
19331935
RecvMsg {
19341936
bytes: r as usize,
19351937
cmsghdr,
1936-
address: Some(address),
1938+
address,
19371939
flags: MsgFlags::from_bits_truncate(mhdr.msg_flags),
19381940
mhdr,
19391941
iobufs: std::marker::PhantomData,
@@ -1951,22 +1953,19 @@ unsafe fn read_mhdr<'a, 'i, S>(
19511953
/// headers are not used
19521954
///
19531955
/// 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(
19551957
iov_buffer: *const IoSliceMut,
19561958
iov_buffer_len: usize,
19571959
cmsg_buffer: *const u8,
19581960
cmsg_capacity: usize,
1959-
address: *mut S,
1960-
) -> msghdr
1961-
where
1962-
S: SockaddrLike
1963-
{
1961+
address: *mut libc::sockaddr_storage,
1962+
) -> msghdr {
19641963
// Musl's msghdr has private fields, so this is the only way to
19651964
// initialize it.
19661965
let mut mhdr = mem::MaybeUninit::<msghdr>::zeroed();
19671966
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;
19701969
(*p).msg_iov = iov_buffer as *mut iovec;
19711970
(*p).msg_iovlen = iov_buffer_len as _;
19721971
(*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
20482047
where S: SockaddrLike + 'a,
20492048
'inner: 'outer
20502049
{
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;
20522052

20532053
let (msg_control, msg_controllen) = cmsg_buffer.as_mut()
20542054
.map(|v| (v.as_mut_ptr(), v.capacity()))
20552055
.unwrap_or((ptr::null_mut(), 0));
20562056
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)
20582058
};
20592059

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

20622062
let r = Errno::result(ret)?;
20632063

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) })
20652067
}
20662068
}
20672069

0 commit comments

Comments
 (0)