@@ -12,9 +12,9 @@ use crate::ssl::TicketKeyCallbackResult;
1212use crate :: x509:: { X509StoreContext , X509StoreContextRef } ;
1313use foreign_types:: ForeignType ;
1414use foreign_types:: ForeignTypeRef ;
15- use libc:: c_char;
16- use libc:: { c_int, c_uchar, c_uint, c_void} ;
15+ use libc:: { c_char, c_int, c_uchar, c_uint, c_void} ;
1716use std:: ffi:: CStr ;
17+ use std:: mem:: MaybeUninit ;
1818use std:: ptr;
1919use std:: slice;
2020use std:: str;
@@ -270,6 +270,11 @@ where
270270 }
271271}
272272
273+ unsafe fn to_uninit < ' a , T : ' a > ( ptr : * mut T ) -> & ' a mut MaybeUninit < T > {
274+ assert ! ( !ptr. is_null( ) ) ;
275+ unsafe { & mut * ptr. cast :: < MaybeUninit < T > > ( ) }
276+ }
277+
273278pub ( super ) unsafe extern "C" fn raw_ticket_key < F > (
274279 ssl : * mut ffi:: SSL ,
275280 key_name : * mut u8 ,
@@ -301,25 +306,24 @@ where
301306
302307 // SAFETY: the callback guarantees that key_name is 16 bytes
303308 let key_name =
304- unsafe { slice:: from_raw_parts_mut ( key_name, ffi:: SSL_TICKET_KEY_NAME_LEN as usize ) } ;
305- let key_name = <& mut [ u8 ; 16 ] >:: try_from ( key_name) . expect ( "boring provides a 16-byte key name" ) ;
309+ unsafe { to_uninit ( key_name. cast :: < [ u8 ; ffi:: SSL_TICKET_KEY_NAME_LEN as usize ] > ( ) ) } ;
306310
307311 // SAFETY: the callback provides 16 bytes iv
308312 //
309313 // https://github.com/google/boringssl/blob/main/ssl/ssl_session.cc#L331
310- let iv = unsafe { core:: slice:: from_raw_parts_mut ( iv, ffi:: EVP_MAX_IV_LENGTH as usize ) } ;
311- let iv = <& mut [ u8 ; ffi:: EVP_MAX_IV_LENGTH as usize ] >:: try_from ( iv)
312- . expect ( "boring provides a 16-byte iv" ) ;
314+ let iv = unsafe { to_uninit ( iv. cast :: < [ u8 ; ffi:: EVP_MAX_IV_LENGTH as usize ] > ( ) ) } ;
313315
314316 // When encrypting a new ticket, encrypt will be one.
315317 let encrypt = encrypt == 1 ;
316318
317319 // Zero-initialize the key_name and iv, since the application is expected to populate these
318320 // fields in the encrypt mode.
319321 if encrypt {
320- unsafe { ptr :: write ( key_name , [ 0 ; 16 ] ) } ;
321- unsafe { ptr :: write ( iv , [ 0 ; ffi :: EVP_MAX_IV_LENGTH as usize ] ) } ;
322+ * key_name = MaybeUninit :: zeroed ( ) ;
323+ * iv = MaybeUninit :: zeroed ( ) ;
322324 }
325+ let key_name = unsafe { key_name. assume_init_mut ( ) } ;
326+ let iv = unsafe { iv. assume_init_mut ( ) } ;
323327
324328 callback ( ssl, key_name, iv, evp_ctx, hmac_ctx, encrypt) . into ( )
325329}
0 commit comments