@@ -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) ]
1616use 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) ]
2323use 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