@@ -81,9 +81,11 @@ static int pkcs11_initialize(PKCS11_CTX_private *cpriv)
8181 args .pReserved = cpriv -> init_args ;
8282 rv = cpriv -> method -> C_Initialize (& args );
8383 if (rv && rv != CKR_CRYPTOKI_ALREADY_INITIALIZED ) {
84+ cpriv -> initialized = 0 ;
8485 CKRerr (P11_F_PKCS11_CTX_LOAD , rv );
8586 return -1 ;
8687 }
88+ cpriv -> initialized = 1 ;
8789 return 0 ;
8890}
8991
@@ -103,18 +105,15 @@ int pkcs11_CTX_load(PKCS11_CTX *ctx, const char *name)
103105 }
104106
105107 if (pkcs11_initialize (cpriv )) {
106- C_UnloadModule (cpriv -> handle );
107- cpriv -> handle = NULL ;
108+ pkcs11_CTX_unload (ctx );
108109 return -1 ;
109110 }
110111
111112 /* Get info on the library */
112113 memset (& ck_info , 0 , sizeof (ck_info ));
113114 rv = cpriv -> method -> C_GetInfo (& ck_info );
114115 if (rv ) {
115- cpriv -> method -> C_Finalize (NULL );
116- C_UnloadModule (cpriv -> handle );
117- cpriv -> handle = NULL ;
116+ pkcs11_CTX_unload (ctx );
118117 CKRerr (P11_F_PKCS11_CTX_LOAD , rv );
119118 return -1 ;
120119 }
@@ -144,16 +143,18 @@ void pkcs11_CTX_unload(PKCS11_CTX *ctx)
144143{
145144 PKCS11_CTX_private * cpriv = PRIVCTX (ctx );
146145
147- if (!cpriv -> method || !cpriv -> handle ) /* Module not loaded */
148- return ;
149-
150146 /* Tell the PKCS11 library to shut down */
151- if (cpriv -> forkid == get_forkid ())
152- cpriv -> method -> C_Finalize (NULL );
147+ if (cpriv -> method ) {
148+ if (cpriv -> initialized && cpriv -> forkid == get_forkid ())
149+ cpriv -> method -> C_Finalize (NULL );
150+ cpriv -> method = NULL ;
151+ }
153152
154153 /* Unload the module */
155- C_UnloadModule (cpriv -> handle );
156- cpriv -> handle = NULL ;
154+ if (cpriv -> handle ) {
155+ C_UnloadModule (cpriv -> handle );
156+ cpriv -> handle = NULL ;
157+ }
157158}
158159
159160/*
0 commit comments