@@ -68,19 +68,34 @@ pub unsafe trait SocketAddrArg {
6868
6969 /// Convert to `SocketAddrAny`.
7070 fn as_any ( & self ) -> SocketAddrAny {
71- // SAFETY: The closure dereferences exactly `len` bytes at `ptr`.
71+ let mut storage = MaybeUninit :: < SocketAddrStorage > :: uninit ( ) ;
72+ // SAFETY: We've allocated `storage` here, we're writing to it, and
73+ // we're using the number of bytes written.
7274 unsafe {
73- self . with_sockaddr ( |ptr, len| {
74- let mut storage = MaybeUninit :: < SocketAddrStorage > :: uninit ( ) ;
75- ptr:: copy_nonoverlapping (
76- ptr. cast :: < u8 > ( ) ,
77- storage. as_mut_ptr ( ) . cast :: < u8 > ( ) ,
78- len as usize ,
79- ) ;
80- SocketAddrAny :: new ( storage, len)
81- } )
75+ let len = self . write_sockaddr ( storage. as_mut_ptr ( ) ) ;
76+ SocketAddrAny :: new ( storage, len)
8277 }
8378 }
79+
80+ /// Encode an address into a `SocketAddrStorage`.
81+ ///
82+ /// Returns the number of bytes that were written.
83+ ///
84+ /// For a safe interface to this functionality, use [`as_any`].
85+ ///
86+ /// [`as_any`]: Self::as_any
87+ ///
88+ /// # Safety
89+ ///
90+ /// `storage` must be valid to write up to `size_of<SocketAddrStorage>()`
91+ /// bytes to.
92+ unsafe fn write_sockaddr ( & self , storage : * mut SocketAddrStorage ) -> SocketAddrLen {
93+ // The closure dereferences exactly `len` bytes at `ptr`.
94+ self . with_sockaddr ( |ptr, len| {
95+ ptr:: copy_nonoverlapping ( ptr. cast :: < u8 > ( ) , storage. cast :: < u8 > ( ) , len as usize ) ;
96+ len
97+ } )
98+ }
8499}
85100
86101/// Helper for implementing SocketAddrArg::with_sockaddr
0 commit comments