On Tue, 11 Nov 2014, Jan Cholasta wrote:
From 10b309f53852665050465df8aa44290dfe232291 Mon Sep 17 00:00:00 2001
From: Jan Cholasta <jchol...@redhat.com>
Date: Mon, 10 Nov 2014 17:33:23 +0000
Subject: [PATCH 2/7] Unload P11_Helper object's library when it is finalized
in ipap11helper

https://fedorahosted.org/freeipa/ticket/4713
---
ipapython/ipap11helper/library.c   | 5 +++++
ipapython/ipap11helper/p11helper.c | 9 +++++++--
2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/ipapython/ipap11helper/library.c b/ipapython/ipap11helper/library.c
index 51e24eb..619604d 100644
--- a/ipapython/ipap11helper/library.c
+++ b/ipapython/ipap11helper/library.c
@@ -70,6 +70,11 @@ CK_C_GetFunctionList loadLibrary(char* module, void** 
moduleHandle)

        // Retrieve the entry point for C_GetFunctionList
        pGetFunctionList = (CK_C_GetFunctionList) dlsym(pDynLib, 
"C_GetFunctionList");
+       if (pGetFunctionList == NULL)
+       {
+               dlclose(pDynLib);
+               return NULL;
+       }

        // Store the handle so we can dlclose it later
        *moduleHandle = pDynLib;
diff --git a/ipapython/ipap11helper/p11helper.c 
b/ipapython/ipap11helper/p11helper.c
index 038c26c..558185e 100644
--- a/ipapython/ipap11helper/p11helper.c
+++ b/ipapython/ipap11helper/p11helper.c
@@ -66,6 +66,7 @@ PyObject_HEAD
CK_SLOT_ID slot;
CK_FUNCTION_LIST_PTR p11;
CK_SESSION_HANDLE session;
+void *module_handle;
} P11_Helper;

typedef enum {
@@ -478,6 +479,7 @@ P11_Helper_new(PyTypeObject *type, PyObject *args, PyObject 
*kwds) {
        self->slot = 0;
        self->session = 0;
        self->p11 = NULL;
+        self->module_handle = NULL;
    }

    return (PyObject *) self;
@@ -496,12 +498,12 @@ static int P11_Helper_init(P11_Helper *self, PyObject 
*args, PyObject *kwds) {
    CK_C_GetFunctionList pGetFunctionList = loadLibrary(library_path,
            &module_handle);
    if (!pGetFunctionList) {
-        if (module_handle != NULL)
-            unloadLibrary(module_handle);
        PyErr_SetString(ipap11helperError, "Could not load the library.");
        return -1;
    }

+    self->module_handle = module_handle;
+
    /*
     * Load the function list
     */
@@ -567,9 +569,12 @@ P11_Helper_finalize(P11_Helper* self) {
     */
    self->p11->C_Finalize(NULL);

+    unloadLibrary(self->module_handle);
+
    self->p11 = NULL;
    self->session = 0;
    self->slot = 0;
+    self->module_handle = NULL;

    return Py_None;
}
ACK.

--
/ Alexander Bokovoy

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to