Skip to content

Commit e395c52

Browse files
committed
Use MaybeUninit for raw_ticket_key key/iv
1 parent 91c95bb commit e395c52

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed

boring/src/ssl/callbacks.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ use crate::ssl::TicketKeyCallbackResult;
1212
use crate::x509::{X509StoreContext, X509StoreContextRef};
1313
use foreign_types::ForeignType;
1414
use 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};
1716
use std::ffi::CStr;
17+
use std::mem::MaybeUninit;
1818
use std::ptr;
1919
use std::slice;
2020
use 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+
273278
pub(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

Comments
 (0)