Skip to content

Commit 4d22385

Browse files
committed
Remove copy from From<SocketAddrV4> for SockAddr
Instead directly write directly to the address storage.
1 parent d3656df commit 4d22385

File tree

1 file changed

+11
-23
lines changed

1 file changed

+11
-23
lines changed

src/sockaddr.rs

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::mem::{self, size_of, MaybeUninit};
22
use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6};
33
use std::path::Path;
4-
use std::{fmt, io};
4+
use std::{fmt, io, ptr};
55

66
#[cfg(windows)]
77
use windows_sys::Win32::Networking::WinSock::SOCKADDR_IN6_0;
@@ -251,29 +251,17 @@ impl From<SocketAddr> for SockAddr {
251251

252252
impl From<SocketAddrV4> for SockAddr {
253253
fn from(addr: SocketAddrV4) -> SockAddr {
254-
let sockaddr_in = sockaddr_in {
255-
sin_family: AF_INET as sa_family_t,
256-
sin_port: addr.port().to_be(),
257-
sin_addr: crate::sys::to_in_addr(addr.ip()),
258-
sin_zero: Default::default(),
259-
#[cfg(any(
260-
target_os = "dragonfly",
261-
target_os = "freebsd",
262-
target_os = "haiku",
263-
target_os = "ios",
264-
target_os = "macos",
265-
target_os = "netbsd",
266-
target_os = "openbsd"
267-
))]
268-
sin_len: 0,
254+
// SAFETY: a `sockaddr_storage` of all zeros is valid.
255+
let mut storage = unsafe { mem::zeroed::<sockaddr_storage>() };
256+
let len = {
257+
let storage = unsafe { &mut *ptr::addr_of_mut!(storage).cast::<sockaddr_in>() };
258+
storage.sin_family = AF_INET as sa_family_t;
259+
storage.sin_port = addr.port().to_be();
260+
storage.sin_addr = crate::sys::to_in_addr(addr.ip());
261+
storage.sin_zero = Default::default();
262+
mem::size_of::<sockaddr_in>() as socklen_t
269263
};
270-
let mut storage = MaybeUninit::<sockaddr_storage>::zeroed();
271-
// Safety: A `sockaddr_in` is memory compatible with a `sockaddr_storage`
272-
unsafe { (storage.as_mut_ptr() as *mut sockaddr_in).write(sockaddr_in) };
273-
SockAddr {
274-
storage: unsafe { storage.assume_init() },
275-
len: mem::size_of::<sockaddr_in>() as socklen_t,
276-
}
264+
SockAddr { storage, len }
277265
}
278266
}
279267

0 commit comments

Comments
 (0)