Merge pull request #194 from valpackett/musl

udp: fix msghdr creation on musl libc
This commit is contained in:
Joakim Frostegård 2024-03-30 10:49:16 +01:00 committed by GitHub
commit 9c185a9595
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 18 additions and 28 deletions

View file

@ -1,6 +1,6 @@
use std::{
mem::MaybeUninit,
net::{Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6},
ptr::null_mut,
};
use aquatic_common::CanonicalSocketAddr;
@ -39,15 +39,13 @@ impl RecvHelper {
sin_zero: [0; 8],
}));
let msghdr_v4 = Box::into_raw(Box::new(libc::msghdr {
msg_name: name_v4 as *mut libc::c_void,
msg_namelen: core::mem::size_of::<libc::sockaddr_in>() as u32,
msg_iov: null_mut(),
msg_iovlen: 0,
msg_control: null_mut(),
msg_controllen: 0,
msg_flags: 0,
}));
// XXX: on musl libc, msghdr contains private padding fields
let msghdr_v4 = unsafe {
let mut hdr = MaybeUninit::<libc::msghdr>::zeroed().assume_init();
hdr.msg_name = name_v4 as *mut libc::c_void;
hdr.msg_namelen = core::mem::size_of::<libc::sockaddr_in>() as u32;
Box::into_raw(Box::new(hdr))
};
let name_v6 = Box::into_raw(Box::new(libc::sockaddr_in6 {
sin6_family: 0,
@ -57,15 +55,13 @@ impl RecvHelper {
sin6_scope_id: 0,
}));
let msghdr_v6 = Box::into_raw(Box::new(libc::msghdr {
msg_name: name_v6 as *mut libc::c_void,
msg_namelen: core::mem::size_of::<libc::sockaddr_in6>() as u32,
msg_iov: null_mut(),
msg_iovlen: 0,
msg_control: null_mut(),
msg_controllen: 0,
msg_flags: 0,
}));
// XXX: on musl libc, msghdr contains private padding fields
let msghdr_v6 = unsafe {
let mut hdr = MaybeUninit::<libc::msghdr>::zeroed().assume_init();
hdr.msg_name = name_v6 as *mut libc::c_void;
hdr.msg_namelen = core::mem::size_of::<libc::sockaddr_in6>() as u32;
Box::into_raw(Box::new(hdr))
};
Self {
socket_is_ipv4: config.network.address.is_ipv4(),

View file

@ -1,6 +1,7 @@
use std::{
io::Cursor,
iter::repeat_with,
mem::MaybeUninit,
net::SocketAddr,
ptr::{addr_of_mut, null_mut},
};
@ -135,21 +136,14 @@ impl SendBuffer {
iov_base: null_mut(),
iov_len: 0,
},
msghdr: libc::msghdr {
msg_name: null_mut(),
msg_namelen: 0,
msg_iov: null_mut(),
msg_iovlen: 1,
msg_control: null_mut(),
msg_controllen: 0,
msg_flags: 0,
},
msghdr: unsafe { MaybeUninit::<libc::msghdr>::zeroed().assume_init() },
});
instance.iovec.iov_base = addr_of_mut!(instance.bytes) as *mut libc::c_void;
instance.iovec.iov_len = instance.bytes.len();
instance.msghdr.msg_iov = addr_of_mut!(instance.iovec);
instance.msghdr.msg_iovlen = 1;
if socket_is_ipv4 {
instance.msghdr.msg_name = addr_of_mut!(instance.name_v4) as *mut libc::c_void;