diff --git a/crates/udp/src/workers/socket/uring/recv_helper.rs b/crates/udp/src/workers/socket/uring/recv_helper.rs index 0aef6d91..7e7ca64d 100644 --- a/crates/udp/src/workers/socket/uring/recv_helper.rs +++ b/crates/udp/src/workers/socket/uring/recv_helper.rs @@ -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::() 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::::zeroed().assume_init(); + hdr.msg_name = name_v4 as *mut libc::c_void; + hdr.msg_namelen = core::mem::size_of::() 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::() 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::::zeroed().assume_init(); + hdr.msg_name = name_v6 as *mut libc::c_void; + hdr.msg_namelen = core::mem::size_of::() as u32; + Box::into_raw(Box::new(hdr)) + }; Self { socket_is_ipv4: config.network.address.is_ipv4(), diff --git a/crates/udp/src/workers/socket/uring/send_buffers.rs b/crates/udp/src/workers/socket/uring/send_buffers.rs index 902e251f..b2b17724 100644 --- a/crates/udp/src/workers/socket/uring/send_buffers.rs +++ b/crates/udp/src/workers/socket/uring/send_buffers.rs @@ -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::::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;