aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Fackler <[email protected]>2016-08-14 11:16:53 -0700
committerSteven Fackler <[email protected]>2016-08-14 11:16:53 -0700
commite5299fd7c9661579d6de30a5be5b032a90203c95 (patch)
tree22d1370eaf79be59ea97a764901324310290a060
parentPKCS #12 support (diff)
downloadrust-openssl-e5299fd7c9661579d6de30a5be5b032a90203c95.tar.xz
rust-openssl-e5299fd7c9661579d6de30a5be5b032a90203c95.zip
Fix memory leak in general name stack
-rw-r--r--openssl-sys/src/lib.rs2
-rw-r--r--openssl/src/x509/mod.rs15
2 files changed, 15 insertions, 2 deletions
diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs
index aa3a0df5..829f6bc1 100644
--- a/openssl-sys/src/lib.rs
+++ b/openssl-sys/src/lib.rs
@@ -1090,6 +1090,8 @@ extern "C" {
pub fn sk_pop_free(st: *mut _STACK, free: Option<unsafe extern "C" fn (*mut c_void)>);
pub fn sk_pop(st: *mut _STACK) -> *mut c_char;
+ pub fn GENERAL_NAME_free(name: *mut GENERAL_NAME);
+
pub fn SSLeay() -> c_long;
pub fn SSLeay_version(key: c_int) -> *const c_char;
}
diff --git a/openssl/src/x509/mod.rs b/openssl/src/x509/mod.rs
index 4943f7a9..fb6c2aaa 100644
--- a/openssl/src/x509/mod.rs
+++ b/openssl/src/x509/mod.rs
@@ -408,7 +408,7 @@ impl<'a> X509Ref<'a> {
}
Some(GeneralNames {
- stack: stack as *const _,
+ stack: stack as *mut _,
m: PhantomData,
})
}
@@ -735,12 +735,23 @@ make_validation_error!(X509_V_OK,
X509ApplicationVerification = X509_V_ERR_APPLICATION_VERIFICATION,
);
+// FIXME remove lifetime param for 0.9
/// A collection of OpenSSL `GENERAL_NAME`s.
pub struct GeneralNames<'a> {
- stack: *const ffi::stack_st_GENERAL_NAME,
+ stack: *mut ffi::stack_st_GENERAL_NAME,
m: PhantomData<&'a ()>,
}
+impl<'a> Drop for GeneralNames<'a> {
+ fn drop(&mut self) {
+ unsafe {
+ let free: unsafe extern "C" fn(*mut ffi::GENERAL_NAME) = ffi::GENERAL_NAME_free;
+ let free: unsafe extern "C" fn(*mut c_void) = mem::transmute(free);
+ ffi::sk_pop_free(&mut (*self.stack).stack, Some(free));
+ }
+ }
+}
+
impl<'a> GeneralNames<'a> {
/// Returns the number of `GeneralName`s in this structure.
pub fn len(&self) -> usize {