Skip to content

Commit d979ef0

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

File tree

1 file changed

+18
-28
lines changed

1 file changed

+18
-28
lines changed

src/sockaddr.rs

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -267,37 +267,27 @@ impl From<SocketAddrV4> for SockAddr {
267267

268268
impl From<SocketAddrV6> for SockAddr {
269269
fn from(addr: SocketAddrV6) -> SockAddr {
270-
let sockaddr_in6 = sockaddr_in6 {
271-
sin6_family: AF_INET6 as sa_family_t,
272-
sin6_port: addr.port().to_be(),
273-
sin6_addr: crate::sys::to_in6_addr(addr.ip()),
274-
sin6_flowinfo: addr.flowinfo(),
270+
// SAFETY: a `sockaddr_storage` of all zeros is valid.
271+
let mut storage = unsafe { mem::zeroed::<sockaddr_storage>() };
272+
let len = {
273+
let storage = unsafe { &mut *ptr::addr_of_mut!(storage).cast::<sockaddr_in6>() };
274+
storage.sin6_family = AF_INET6 as sa_family_t;
275+
storage.sin6_port = addr.port().to_be();
276+
storage.sin6_addr = crate::sys::to_in6_addr(addr.ip());
277+
storage.sin6_flowinfo = addr.flowinfo();
275278
#[cfg(unix)]
276-
sin6_scope_id: addr.scope_id(),
279+
{
280+
storage.sin6_scope_id = addr.scope_id();
281+
}
277282
#[cfg(windows)]
278-
Anonymous: SOCKADDR_IN6_0 {
279-
sin6_scope_id: addr.scope_id(),
280-
},
281-
#[cfg(any(
282-
target_os = "dragonfly",
283-
target_os = "freebsd",
284-
target_os = "haiku",
285-
target_os = "ios",
286-
target_os = "macos",
287-
target_os = "netbsd",
288-
target_os = "openbsd"
289-
))]
290-
sin6_len: 0,
291-
#[cfg(any(target_os = "solaris", target_os = "illumos"))]
292-
__sin6_src_id: 0,
283+
{
284+
storage.Anonymous = SOCKADDR_IN6_0 {
285+
sin6_scope_id: addr.scope_id(),
286+
};
287+
}
288+
mem::size_of::<sockaddr_in6>() as socklen_t
293289
};
294-
let mut storage = MaybeUninit::<sockaddr_storage>::zeroed();
295-
// Safety: A `sockaddr_in6` is memory compatible with a `sockaddr_storage`
296-
unsafe { (storage.as_mut_ptr() as *mut sockaddr_in6).write(sockaddr_in6) };
297-
SockAddr {
298-
storage: unsafe { storage.assume_init() },
299-
len: mem::size_of::<sockaddr_in6>() as socklen_t,
300-
}
290+
SockAddr { storage, len }
301291
}
302292
}
303293

0 commit comments

Comments
 (0)