From: Nikos Mavrogiannopoulos Date: Wed, 19 Jan 2011 11:35:32 +0000 (+0100) Subject: CKR_CRYPTOKI_ALREADY_INITIALIZED is not treated as an error, and Finalize is not... X-Git-Tag: gnutls_2_11_7~83 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e43f90fea05d2578ab8398fafda644eb8977b4d9;p=thirdparty%2Fgnutls.git CKR_CRYPTOKI_ALREADY_INITIALIZED is not treated as an error, and Finalize is not called in that case. --- diff --git a/lib/pakchois/pakchois.c b/lib/pakchois/pakchois.c index d04b3caba3..0c2a86a1e4 100644 --- a/lib/pakchois/pakchois.c +++ b/lib/pakchois/pakchois.c @@ -63,6 +63,7 @@ struct provider void *mutex; const struct ck_function_list *fns; unsigned int refcount; + unsigned int finalize:1; /* whether to finalize this one */ struct provider *next, **prevref; void *reserved; }; @@ -342,11 +343,19 @@ load_pkcs11_module (struct provider **provider, args.reserved = reserved; rv = fns->C_Initialize (&args); - if (rv != CKR_OK) + if (rv != CKR_OK && rv != CKR_CRYPTOKI_ALREADY_INITIALIZED) { goto fail_ctx; } + /* no need to finalize if someone else has + * initialized the library before us. + */ + if (rv == CKR_CRYPTOKI_ALREADY_INITIALIZED) + prov->finalize = 0; + else + prov->finalize = 1; + prov->next = provider_list; prov->prevref = &provider_list; if (prov->next) @@ -542,7 +551,8 @@ provider_unref (struct provider *prov) if (--prov->refcount == 0) { - prov->fns->C_Finalize (NULL); + if (prov->finalize) + prov->fns->C_Finalize (NULL); dlclose (prov->handle); *prov->prevref = prov->next; if (prov->next)