From 06c2459038c1c5d524232fe155a4f04b8d82466c Mon Sep 17 00:00:00 2001 From: Joshua Issac Date: Thu, 9 Apr 2026 00:18:37 +0100 Subject: [PATCH] test: fix solarish_tap test on big-endian Solaris (#2743) --- src/sys/socket/addr.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/sys/socket/addr.rs b/src/sys/socket/addr.rs index 09be1d68b5..a4f919f467 100644 --- a/src/sys/socket/addr.rs +++ b/src/sys/socket/addr.rs @@ -2290,9 +2290,26 @@ mod tests { #[cfg(solarish)] #[test] fn solarish_tap() { - let bytes = [25u8, 0, 0, 0, 6, 0, 6, 0, 24, 101, 144, 221, 76, 176]; - let ptr = bytes.as_ptr(); - let sa = ptr as *const libc::sockaddr; + let mut bytes = [0u8, 0, 0, 0, 6, 0, 6, 0, 24, 101, 144, 221, 76, 176]; + // First two elements in array correspond to single 2-byte integer + // representing sa_family + let family: u16 = 25; + // Copy to the array based on the native endianness of the machine + bytes[0..2].copy_from_slice(&family.to_ne_bytes()); + + // Only 1-byte alignment guaranteed by u8 array. Put into buffer that + // guarantees sufficient alignment per POSIX, to take pointer. + let mut ss = mem::MaybeUninit::::zeroed(); + unsafe { + ptr::copy_nonoverlapping( + bytes.as_ptr(), + ss.as_mut_ptr() as *mut u8, + bytes.len(), + ); + } + let ss = unsafe { ss.assume_init() }; + + let sa = &ss as *const _ as *const libc::sockaddr; let len = Some(bytes.len() as socklen_t); let _sock_addr = unsafe { SockaddrStorage::from_raw(sa, len) };