@@ -9,16 +9,16 @@ use libc::{
9
9
socklen_t, AF_INET , AF_INET6 ,
10
10
} ;
11
11
#[ 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} ;
13
13
#[ 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} ;
15
15
#[ cfg( windows) ]
16
16
use winapi:: shared:: ws2def:: {
17
17
ADDRESS_FAMILY as sa_family_t, AF_INET , AF_INET6 , SOCKADDR as sockaddr,
18
18
SOCKADDR_IN as sockaddr_in, SOCKADDR_STORAGE as sockaddr_storage,
19
19
} ;
20
20
#[ 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} ;
22
22
#[ cfg( windows) ]
23
23
use winapi:: um:: ws2tcpip:: socklen_t;
24
24
@@ -151,9 +151,10 @@ impl SockAddr {
151
151
#[ cfg( unix) ]
152
152
let ip = Ipv4Addr :: from ( addr. sin_addr . s_addr . to_ne_bytes ( ) ) ;
153
153
#[ 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
+ } ;
157
158
158
159
let port = u16:: from_be ( addr. sin_port ) ;
159
160
Some ( SocketAddr :: V4 ( SocketAddrV4 :: new ( ip, port) ) )
@@ -208,8 +209,10 @@ impl From<SocketAddrV4> for SockAddr {
208
209
s_addr : u32:: from_ne_bytes ( addr. ip ( ) . octets ( ) ) ,
209
210
} ;
210
211
#[ 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 }
213
216
} ;
214
217
* sockaddr_in = sockaddr_in {
215
218
sin_family : AF_INET as sa_family_t ,
@@ -229,14 +232,22 @@ impl From<SocketAddrV6> for SockAddr {
229
232
let mut storage = MaybeUninit :: < sockaddr_storage > :: uninit ( ) ;
230
233
let sockaddr_in6 = unsafe { & mut * ( storage. as_mut_ptr ( ) as * mut sockaddr_in6 ) } ;
231
234
232
- #[ cfg( windows) ]
233
- let sin6_addr = in6_addr {
234
- u : unsafe { mem:: transmute ( addr. ip ( ) . octets ( ) ) } ,
235
- } ;
236
235
#[ cfg( unix) ]
237
236
let sin6_addr = in6_addr {
238
237
s6_addr : addr. ip ( ) . octets ( ) ,
239
238
} ;
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
+ } ;
240
251
* sockaddr_in6 = sockaddr_in6 {
241
252
sin6_family : AF_INET6 as sa_family_t ,
242
253
sin6_port : addr. port ( ) . to_be ( ) ,
@@ -245,7 +256,7 @@ impl From<SocketAddrV6> for SockAddr {
245
256
#[ cfg( unix) ]
246
257
sin6_scope_id : addr. scope_id ( ) ,
247
258
#[ cfg( windows) ]
248
- u : unsafe { mem :: transmute ( addr . scope_id ( ) ) } ,
259
+ u,
249
260
..unsafe { mem:: zeroed ( ) }
250
261
} ;
251
262
SockAddr {
0 commit comments