Commit e5299fd7 authored by Steven Fackler's avatar Steven Fackler
Browse files

Fix memory leak in general name stack

parent 6b12a0cd
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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;
}
+13 −2
Original line number Diff line number Diff line
@@ -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 {