aboutsummaryrefslogtreecommitdiff
path: root/openssl/src
diff options
context:
space:
mode:
authorSteven Fackler <[email protected]>2016-10-18 21:11:23 -0700
committerSteven Fackler <[email protected]>2016-10-18 21:13:13 -0700
commitc4459c37d98b3a56723e6698852698fb2f354d47 (patch)
tree9e1e7e1187effd4bdadd7a32c9e3c634c31ccfd8 /openssl/src
parentDon't ignore errors in NPN/ALPN logic (diff)
downloadrust-openssl-c4459c37d98b3a56723e6698852698fb2f354d47.tar.xz
rust-openssl-c4459c37d98b3a56723e6698852698fb2f354d47.zip
Callback cleanup
Diffstat (limited to 'openssl/src')
-rw-r--r--openssl/src/crypto/util.rs16
-rw-r--r--openssl/src/ssl/mod.rs43
2 files changed, 24 insertions, 35 deletions
diff --git a/openssl/src/crypto/util.rs b/openssl/src/crypto/util.rs
index c11285f8..07099b7c 100644
--- a/openssl/src/crypto/util.rs
+++ b/openssl/src/crypto/util.rs
@@ -36,16 +36,16 @@ impl<F> Drop for CallbackState<F> {
/// Password callback function, passed to private key loading functions.
///
/// `cb_state` is expected to be a pointer to a `CallbackState`.
-pub extern "C" fn invoke_passwd_cb<F>(buf: *mut c_char,
- size: c_int,
- _rwflag: c_int,
- cb_state: *mut c_void)
- -> c_int
- where F: FnOnce(&mut [c_char]) -> usize {
+pub unsafe extern fn invoke_passwd_cb<F>(buf: *mut c_char,
+ size: c_int,
+ _rwflag: c_int,
+ cb_state: *mut c_void)
+ -> c_int
+ where F: FnOnce(&mut [c_char]) -> usize {
let result = panic::catch_unwind(|| {
// build a `i8` slice to pass to the user callback
- let pass_slice = unsafe { slice::from_raw_parts_mut(buf, size as usize) };
- let callback = unsafe { &mut *(cb_state as *mut CallbackState<F>) };
+ let pass_slice = slice::from_raw_parts_mut(buf, size as usize);
+ let callback = &mut *(cb_state as *mut CallbackState<F>);
callback.cb.take().unwrap()(pass_slice)
});
diff --git a/openssl/src/ssl/mod.rs b/openssl/src/ssl/mod.rs
index cd7fe7b9..fafac45c 100644
--- a/openssl/src/ssl/mod.rs
+++ b/openssl/src/ssl/mod.rs
@@ -142,20 +142,20 @@ lazy_static! {
static ref ALPN_PROTOS_IDX: c_int = get_new_idx::<Vec<u8>>();
}
+unsafe extern fn free_data_box<T>(_parent: *mut c_void,
+ ptr: *mut c_void,
+ _ad: *mut ffi::CRYPTO_EX_DATA,
+ _idx: c_int,
+ _argl: c_long,
+ _argp: *mut c_void) {
+ if !ptr.is_null() {
+ Box::<T>::from_raw(ptr as *mut T);
+ }
+}
+
/// Determine a new index to use for SSL CTX ex data.
/// Registers a destruct for the data which will be called by openssl when the context is freed.
fn get_new_idx<T>() -> c_int {
- extern fn free_data_box<T>(_parent: *mut c_void,
- ptr: *mut c_void,
- _ad: *mut ffi::CRYPTO_EX_DATA,
- _idx: c_int,
- _argl: c_long,
- _argp: *mut c_void) {
- if !ptr.is_null() {
- let _: Box<T> = unsafe { mem::transmute(ptr) };
- }
- }
-
unsafe {
let idx = compat::get_new_idx(free_data_box::<T>);
assert!(idx >= 0);
@@ -164,17 +164,6 @@ fn get_new_idx<T>() -> c_int {
}
fn get_new_ssl_idx<T>() -> c_int {
- extern fn free_data_box<T>(_parent: *mut c_void,
- ptr: *mut c_void,
- _ad: *mut ffi::CRYPTO_EX_DATA,
- _idx: c_int,
- _argl: c_long,
- _argp: *mut c_void) {
- if !ptr.is_null() {
- let _: Box<T> = unsafe { mem::transmute(ptr) };
- }
- }
-
unsafe {
let idx = compat::get_new_ssl_idx(free_data_box::<T>);
assert!(idx >= 0);
@@ -190,7 +179,7 @@ extern fn raw_verify<F>(preverify_ok: c_int, x509_ctx: *mut ffi::X509_STORE_CTX)
let ssl = ffi::X509_STORE_CTX_get_ex_data(x509_ctx, idx);
let ssl_ctx = ffi::SSL_get_SSL_CTX(ssl as *const _);
let verify = ffi::SSL_CTX_get_ex_data(ssl_ctx, get_verify_data_idx::<F>());
- let verify: &F = mem::transmute(verify);
+ let verify: &F = &*(verify as *mut F);
let ctx = X509StoreContext::new(x509_ctx);
@@ -206,7 +195,7 @@ extern fn ssl_raw_verify<F>(preverify_ok: c_int, x509_ctx: *mut ffi::X509_STORE_
let ssl = ffi::X509_STORE_CTX_get_ex_data(x509_ctx, idx);
let verify = ffi::SSL_get_ex_data(ssl as *const _,
get_ssl_verify_data_idx::<F>());
- let verify: &F = mem::transmute(verify);
+ let verify: &F = &*(verify as *mut F);
let ctx = X509StoreContext::new(x509_ctx);
@@ -220,7 +209,7 @@ extern fn raw_sni<F>(ssl: *mut ffi::SSL, al: *mut c_int, _arg: *mut c_void) -> c
unsafe {
let ssl_ctx = ffi::SSL_get_SSL_CTX(ssl);
let callback = ffi::SSL_CTX_get_ex_data(ssl_ctx, get_verify_data_idx::<F>());
- let callback: &F = mem::transmute(callback);
+ let callback: &F = &*(callback as *mut F);
let mut ssl = SslRef::from_ptr(ssl);
match callback(&mut ssl) {
@@ -250,7 +239,7 @@ unsafe fn select_proto_using(ssl: *mut ffi::SSL,
// extra data.
let ssl_ctx = ffi::SSL_get_SSL_CTX(ssl);
let protocols = ffi::SSL_CTX_get_ex_data(ssl_ctx, ex_data);
- let protocols: &Vec<u8> = mem::transmute(protocols);
+ let protocols: &Vec<u8> = &*(protocols as *mut Vec<u8>);
// Prepare the client list parameters to be passed to the OpenSSL function...
let client = protocols.as_ptr();
let client_len = protocols.len() as c_uint;
@@ -313,7 +302,7 @@ extern fn raw_next_protos_advertise_cb(ssl: *mut ffi::SSL,
} else {
// If the pointer is valid, put the pointer to the actual byte array into the
// output parameter `out`, as well as its length into `outlen`.
- let protocols: &Vec<u8> = mem::transmute(protocols);
+ let protocols: &Vec<u8> = &*(protocols as *mut Vec<u8>);
*out = protocols.as_ptr();
*outlen = protocols.len() as c_uint;
}