aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSteven Fackler <[email protected]>2014-10-05 16:40:01 -0400
committerSteven Fackler <[email protected]>2014-10-05 16:40:01 -0400
commitd136a6bb572e1fdee114ad246c17e9e169d08935 (patch)
treecc33db889fdbfd7724130c176b549d4320c64db2 /src
parentClean up warnings (diff)
parentLoad crypto error strings (diff)
downloadrust-openssl-d136a6bb572e1fdee114ad246c17e9e169d08935.tar.xz
rust-openssl-d136a6bb572e1fdee114ad246c17e9e169d08935.zip
Merge pull request #59 from jroesch/better-errors
Make errors human readable
Diffstat (limited to 'src')
-rw-r--r--src/ffi.rs9
-rw-r--r--src/ssl/error.rs31
-rw-r--r--src/ssl/mod.rs2
3 files changed, 32 insertions, 10 deletions
diff --git a/src/ffi.rs b/src/ffi.rs
index 2118391b..9ceb7f31 100644
--- a/src/ffi.rs
+++ b/src/ffi.rs
@@ -272,6 +272,12 @@ extern "C" {
pub fn ERR_get_error() -> c_ulong;
+ pub fn ERR_lib_error_string(err: c_ulong) -> *const c_char;
+ pub fn ERR_func_error_string(err: c_ulong) -> *const c_char;
+ pub fn ERR_reason_error_string(err: c_ulong) -> *const c_char;
+
+ pub fn ERR_load_crypto_strings();
+
pub fn EVP_md5() -> *const EVP_MD;
pub fn EVP_ripemd160() -> *const EVP_MD;
pub fn EVP_sha1() -> *const EVP_MD;
@@ -345,6 +351,8 @@ extern "C" {
pub fn SSL_library_init() -> c_int;
+ pub fn SSL_load_error_strings();
+
#[cfg(feature = "sslv2")]
pub fn SSLv2_method() -> *const SSL_METHOD;
pub fn SSLv3_method() -> *const SSL_METHOD;
@@ -421,4 +429,3 @@ extern "C" {
pub fn i2d_RSAPrivateKey(k: *mut RSA, buf: *const *mut u8) -> c_int;
pub fn d2i_RSAPrivateKey(k: *const *mut RSA, buf: *const *const u8, len: c_uint) -> *mut RSA;
}
-
diff --git a/src/ssl/error.rs b/src/ssl/error.rs
index 452f8aad..0c1af90a 100644
--- a/src/ssl/error.rs
+++ b/src/ssl/error.rs
@@ -1,5 +1,6 @@
use libc::c_ulong;
use std::io::IoError;
+use std::c_str::CString;
use ffi;
@@ -20,24 +21,36 @@ pub enum OpensslError {
/// An unknown error
UnknownError {
/// The library reporting the error
- library: u8,
+ library: String,
/// The function reporting the error
- function: u16,
+ function: String,
/// The reason for the error
- reason: u16
+ reason: String
}
}
-fn get_lib(err: c_ulong) -> u8 {
- ((err >> 24) & 0xff) as u8
+fn get_lib(err: c_ulong) -> String {
+ unsafe { CString::new(ffi::ERR_lib_error_string(err), false) }.to_string()
}
-fn get_func(err: c_ulong) -> u16 {
- ((err >> 12) & 0xfff) as u16
+fn get_func(err: c_ulong) -> String {
+ unsafe { CString::new(ffi::ERR_func_error_string(err), false).to_string() }
}
-fn get_reason(err: c_ulong) -> u16 {
- (err & 0xfff) as u16
+fn get_reason(err: c_ulong) -> String {
+ unsafe { CString::new(ffi::ERR_reason_error_string(err), false).to_string() }
+}
+
+#[test]
+fn test_uknown_error_should_have_correct_messages() {
+ let err = 336032784;
+ let library = get_lib(err);
+ let function = get_func(err);
+ let reason = get_reason(err);
+
+ assert_eq!(library.as_slice(),"SSL routines");
+ assert_eq!(function.as_slice(), "SSL23_GET_SERVER_HELLO");
+ assert_eq!(reason.as_slice(), "sslv3 alert handshake failure");
}
impl SslError {
diff --git a/src/ssl/mod.rs b/src/ssl/mod.rs
index 379a98cf..c7c024ed 100644
--- a/src/ssl/mod.rs
+++ b/src/ssl/mod.rs
@@ -24,6 +24,8 @@ fn init() {
unsafe {
INIT.doit(|| {
ffi::SSL_library_init();
+ ffi::SSL_load_error_strings();
+ ffi::ERR_load_crypto_strings();
let verify_idx = ffi::SSL_CTX_get_ex_new_index(0, ptr::null(), None,
None, None);
assert!(verify_idx >= 0);