@@ -183,27 +183,28 @@ impl SockAddr {
183
183
184
184
impl From < SocketAddrV4 > for SockAddr {
185
185
fn from ( addr : SocketAddrV4 ) -> SockAddr {
186
- let sockaddr_in = sockaddr_in {
186
+ let mut storage = MaybeUninit :: < sockaddr_storage > :: uninit ( ) ;
187
+ let sockaddr_in = unsafe { & mut * ( storage. as_mut_ptr ( ) as * mut sockaddr_in ) } ;
188
+ * sockaddr_in = sockaddr_in {
187
189
sin_family : AF_INET as sa_family_t ,
188
190
sin_port : addr. port ( ) . to_be ( ) ,
189
191
sin_addr : in_addr {
190
192
s_addr : u32:: from_ne_bytes ( addr. ip ( ) . octets ( ) ) ,
191
193
} ,
192
194
..unsafe { mem:: zeroed ( ) }
193
195
} ;
194
-
195
- unsafe {
196
- SockAddr :: from_raw_parts (
197
- & sockaddr_in as * const _ as * const _ ,
198
- mem:: size_of :: < sockaddr_in > ( ) as socklen_t ,
199
- )
196
+ SockAddr {
197
+ storage : unsafe { storage. assume_init ( ) } ,
198
+ len : mem:: size_of :: < sockaddr_in > ( ) as socklen_t ,
200
199
}
201
200
}
202
201
}
203
202
204
203
impl From < SocketAddrV6 > for SockAddr {
205
204
fn from ( addr : SocketAddrV6 ) -> SockAddr {
206
- let sockaddr_in6 = sockaddr_in6 {
205
+ let mut storage = MaybeUninit :: < sockaddr_storage > :: uninit ( ) ;
206
+ let sockaddr_in6 = unsafe { & mut * ( storage. as_mut_ptr ( ) as * mut sockaddr_in6 ) } ;
207
+ * sockaddr_in6 = sockaddr_in6 {
207
208
sin6_family : AF_INET6 as sa_family_t ,
208
209
sin6_port : addr. port ( ) . to_be ( ) ,
209
210
sin6_addr : in6_addr {
@@ -213,11 +214,9 @@ impl From<SocketAddrV6> for SockAddr {
213
214
sin6_scope_id : addr. scope_id ( ) ,
214
215
..unsafe { mem:: zeroed ( ) }
215
216
} ;
216
- unsafe {
217
- SockAddr :: from_raw_parts (
218
- & sockaddr_in6 as * const _ as * const _ ,
219
- mem:: size_of :: < sockaddr_in6 > ( ) as socklen_t ,
220
- )
217
+ SockAddr {
218
+ storage : unsafe { storage. assume_init ( ) } ,
219
+ len : mem:: size_of :: < sockaddr_in6 > ( ) as socklen_t ,
221
220
}
222
221
}
223
222
}
0 commit comments