|
1 | 1 | use std::mem::{self, size_of, MaybeUninit};
|
2 | 2 | use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6};
|
3 | 3 | use std::path::Path;
|
4 |
| -use std::{fmt, io}; |
| 4 | +use std::{fmt, io, ptr}; |
5 | 5 |
|
6 | 6 | #[cfg(windows)]
|
7 | 7 | use windows_sys::Win32::Networking::WinSock::SOCKADDR_IN6_0;
|
@@ -251,29 +251,17 @@ impl From<SocketAddr> for SockAddr {
|
251 | 251 |
|
252 | 252 | impl From<SocketAddrV4> for SockAddr {
|
253 | 253 | 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 |
269 | 263 | };
|
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 } |
277 | 265 | }
|
278 | 266 | }
|
279 | 267 |
|
|
0 commit comments