From 58f6d1138afc6381694c9080c398eb851b455ecd Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Fri, 21 Oct 2016 21:52:02 -0700 Subject: [PATCH] Properly propagate panics --- openssl/src/crypto/util.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/openssl/src/crypto/util.rs b/openssl/src/crypto/util.rs index 07099b7c..68d9b32a 100644 --- a/openssl/src/crypto/util.rs +++ b/openssl/src/crypto/util.rs @@ -1,7 +1,7 @@ use libc::{c_int, c_char, c_void}; use std::any::Any; -use std::panic; +use std::panic::{self, AssertUnwindSafe}; use std::slice; /// Wraps a user-supplied callback and a slot for panics thrown inside the callback (while FFI @@ -42,17 +42,20 @@ pub unsafe extern fn invoke_passwd_cb(buf: *mut c_char, cb_state: *mut c_void) -> c_int where F: FnOnce(&mut [c_char]) -> usize { - let result = panic::catch_unwind(|| { + let callback = &mut *(cb_state as *mut CallbackState); + + let result = panic::catch_unwind(AssertUnwindSafe(|| { // build a `i8` slice to pass to the user callback let pass_slice = slice::from_raw_parts_mut(buf, size as usize); - let callback = &mut *(cb_state as *mut CallbackState); callback.cb.take().unwrap()(pass_slice) - }); + })); - if let Ok(len) = result { - return len as c_int; - } else { - return 0; + match result { + Ok(len) => len as c_int, + Err(err) => { + callback.panic = Some(err); + 0 + } } }