From ed9f600e2889906bb928150d7e892370062f6ca1 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sun, 13 Nov 2016 16:18:52 +0000 Subject: [PATCH] Make password callback return a Result --- openssl/src/dsa.rs | 2 +- openssl/src/macros.rs | 2 +- openssl/src/rsa.rs | 2 +- openssl/src/util.rs | 10 ++++++++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/openssl/src/dsa.rs b/openssl/src/dsa.rs index 39f98475..9afb952e 100644 --- a/openssl/src/dsa.rs +++ b/openssl/src/dsa.rs @@ -237,7 +237,7 @@ mod test { Dsa::private_key_from_pem_callback(key, |password| { password_queried = true; password[..6].copy_from_slice(b"mypass"); - 6 + Ok(6) }) .unwrap(); diff --git a/openssl/src/macros.rs b/openssl/src/macros.rs index 6c37f7b0..0be5ff17 100644 --- a/openssl/src/macros.rs +++ b/openssl/src/macros.rs @@ -81,7 +81,7 @@ macro_rules! private_key_from_pem { pub fn private_key_from_pem_callback(pem: &[u8], callback: F) -> Result<$t, ::error::ErrorStack> - where F: FnOnce(&mut [u8]) -> usize + where F: FnOnce(&mut [u8]) -> Result { unsafe { ffi::init(); diff --git a/openssl/src/rsa.rs b/openssl/src/rsa.rs index 5f94fd82..f2dd8d00 100644 --- a/openssl/src/rsa.rs +++ b/openssl/src/rsa.rs @@ -421,7 +421,7 @@ mod test { Rsa::private_key_from_pem_callback(key, |password| { password_queried = true; password[..6].copy_from_slice(b"mypass"); - 6 + Ok(6) }) .unwrap(); diff --git a/openssl/src/util.rs b/openssl/src/util.rs index dea94668..f4883976 100644 --- a/openssl/src/util.rs +++ b/openssl/src/util.rs @@ -4,6 +4,8 @@ use std::cell::UnsafeCell; use std::panic::{self, AssertUnwindSafe}; use std::slice; +use error::ErrorStack; + /// Wraps a user-supplied callback and a slot for panics thrown inside the callback (while FFI /// frames are on the stack). /// @@ -64,7 +66,7 @@ pub unsafe extern fn invoke_passwd_cb(buf: *mut c_char, _rwflag: c_int, cb_state: *mut c_void) -> c_int - where F: FnOnce(&mut [u8]) -> usize + where F: FnOnce(&mut [u8]) -> Result { let callback = &mut *(cb_state as *mut CallbackState); @@ -74,7 +76,11 @@ pub unsafe extern fn invoke_passwd_cb(buf: *mut c_char, })); match result { - Ok(len) => len as c_int, + Ok(Ok(len)) => len as c_int, + Ok(Err(_)) => { + // FIXME restore error stack + 0 + } Err(err) => { callback.panic = Some(err); 0