@@ -183,27 +183,28 @@ impl SockAddr {
183183
184184impl From < SocketAddrV4 > for SockAddr {
185185 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 {
187189 sin_family : AF_INET as sa_family_t ,
188190 sin_port : addr. port ( ) . to_be ( ) ,
189191 sin_addr : in_addr {
190192 s_addr : u32:: from_ne_bytes ( addr. ip ( ) . octets ( ) ) ,
191193 } ,
192194 ..unsafe { mem:: zeroed ( ) }
193195 } ;
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 ,
200199 }
201200 }
202201}
203202
204203impl From < SocketAddrV6 > for SockAddr {
205204 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 {
207208 sin6_family : AF_INET6 as sa_family_t ,
208209 sin6_port : addr. port ( ) . to_be ( ) ,
209210 sin6_addr : in6_addr {
@@ -213,11 +214,9 @@ impl From<SocketAddrV6> for SockAddr {
213214 sin6_scope_id : addr. scope_id ( ) ,
214215 ..unsafe { mem:: zeroed ( ) }
215216 } ;
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 ,
221220 }
222221 }
223222}
0 commit comments