Skip to content

Commit

Permalink
Merge pull request #194 from valpackett/musl
Browse files Browse the repository at this point in the history
udp: fix msghdr creation on musl libc
  • Loading branch information
greatest-ape authored Mar 30, 2024
2 parents 842dd89 + 2d18eb6 commit 9c185a9
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 28 deletions.
34 changes: 15 additions & 19 deletions crates/udp/src/workers/socket/uring/recv_helper.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::{
mem::MaybeUninit,
net::{Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6},
ptr::null_mut,
};

use aquatic_common::CanonicalSocketAddr;
Expand Down Expand Up @@ -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,
Expand All @@ -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(),
Expand Down
12 changes: 3 additions & 9 deletions crates/udp/src/workers/socket/uring/send_buffers.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use std::{
io::Cursor,
iter::repeat_with,
mem::MaybeUninit,
net::SocketAddr,
ptr::{addr_of_mut, null_mut},
};
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 9c185a9

Please sign in to comment.