Skip to content

Commit 09eb49b

Browse files
committed
Get rid of mem::transmute in favor of correctly init values
1 parent 738612a commit 09eb49b

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

src/sockaddr.rs

+24-13
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ use libc::{
99
socklen_t, AF_INET, AF_INET6,
1010
};
1111
#[cfg(windows)]
12-
use winapi::shared::in6addr::IN6_ADDR as in6_addr;
12+
use winapi::shared::in6addr::{in6_addr_u, IN6_ADDR as in6_addr};
1313
#[cfg(windows)]
14-
use winapi::shared::inaddr::IN_ADDR as in_addr;
14+
use winapi::shared::inaddr::{in_addr_S_un, IN_ADDR as in_addr};
1515
#[cfg(windows)]
1616
use winapi::shared::ws2def::{
1717
ADDRESS_FAMILY as sa_family_t, AF_INET, AF_INET6, SOCKADDR as sockaddr,
1818
SOCKADDR_IN as sockaddr_in, SOCKADDR_STORAGE as sockaddr_storage,
1919
};
2020
#[cfg(windows)]
21-
use winapi::shared::ws2ipdef::SOCKADDR_IN6_LH as sockaddr_in6;
21+
use winapi::shared::ws2ipdef::{SOCKADDR_IN6_LH_u, SOCKADDR_IN6_LH as sockaddr_in6};
2222
#[cfg(windows)]
2323
use winapi::um::ws2tcpip::socklen_t;
2424

@@ -151,9 +151,10 @@ impl SockAddr {
151151
#[cfg(unix)]
152152
let ip = Ipv4Addr::from(addr.sin_addr.s_addr.to_ne_bytes());
153153
#[cfg(windows)]
154-
let ip_bytes = unsafe { addr.sin_addr.S_un.S_un_b() };
155-
#[cfg(windows)]
156-
let ip = Ipv4Addr::from([ip_bytes.s_b1, ip_bytes.s_b2, ip_bytes.s_b3, ip_bytes.s_b4]);
154+
let ip = {
155+
let ip_bytes = unsafe { addr.sin_addr.S_un.S_un_b() };
156+
Ipv4Addr::from([ip_bytes.s_b1, ip_bytes.s_b2, ip_bytes.s_b3, ip_bytes.s_b4])
157+
};
157158

158159
let port = u16::from_be(addr.sin_port);
159160
Some(SocketAddr::V4(SocketAddrV4::new(ip, port)))
@@ -208,8 +209,10 @@ impl From<SocketAddrV4> for SockAddr {
208209
s_addr: u32::from_ne_bytes(addr.ip().octets()),
209210
};
210211
#[cfg(windows)]
211-
let sin_addr = in_addr {
212-
S_un: unsafe { mem::transmute(u32::from_ne_bytes(addr.ip().octets())) },
212+
let sin_addr = unsafe {
213+
let mut s_un = mem::zeroed::<in_addr_S_un>();
214+
*s_un.S_addr_mut() = u32::from_ne_bytes(addr.ip().octets());
215+
in_addr { S_un: s_un }
213216
};
214217
*sockaddr_in = sockaddr_in {
215218
sin_family: AF_INET as sa_family_t,
@@ -229,14 +232,22 @@ impl From<SocketAddrV6> for SockAddr {
229232
let mut storage = MaybeUninit::<sockaddr_storage>::uninit();
230233
let sockaddr_in6 = unsafe { &mut *(storage.as_mut_ptr() as *mut sockaddr_in6) };
231234

232-
#[cfg(windows)]
233-
let sin6_addr = in6_addr {
234-
u: unsafe { mem::transmute(addr.ip().octets()) },
235-
};
236235
#[cfg(unix)]
237236
let sin6_addr = in6_addr {
238237
s6_addr: addr.ip().octets(),
239238
};
239+
#[cfg(windows)]
240+
let sin6_addr = unsafe {
241+
let mut u = mem::zeroed::<in6_addr_u>();
242+
*u.Byte_mut() = addr.ip().octets();
243+
in6_addr { u }
244+
};
245+
#[cfg(windows)]
246+
let u = unsafe {
247+
let mut u = mem::zeroed::<SOCKADDR_IN6_LH_u>();
248+
*u.sin6_scope_id_mut() = addr.scope_id();
249+
u
250+
};
240251
*sockaddr_in6 = sockaddr_in6 {
241252
sin6_family: AF_INET6 as sa_family_t,
242253
sin6_port: addr.port().to_be(),
@@ -245,7 +256,7 @@ impl From<SocketAddrV6> for SockAddr {
245256
#[cfg(unix)]
246257
sin6_scope_id: addr.scope_id(),
247258
#[cfg(windows)]
248-
u: unsafe { mem::transmute(addr.scope_id()) },
259+
u,
249260
..unsafe { mem::zeroed() }
250261
};
251262
SockAddr {

0 commit comments

Comments
 (0)