From 2d18eb668687da5a3056994496f44daafac315f9 Mon Sep 17 00:00:00 2001 From: Val Packett Date: Fri, 22 Mar 2024 15:35:34 -0300 Subject: [PATCH] udp: fix msghdr creation on musl libc Right now building for musl also requires updating glommio to a git version. --- .../src/workers/socket/uring/recv_helper.rs | 34 ++++++++----------- .../src/workers/socket/uring/send_buffers.rs | 12 ++----- 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/crates/udp/src/workers/socket/uring/recv_helper.rs b/crates/udp/src/workers/socket/uring/recv_helper.rs index 0aef6d9..7e7ca64 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 902e251..b2b1772 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;