Skip to content

Commit 545a323

Browse files
committed
Skip C_Finalize() when pkcs11_CTX_reload() has failed
1 parent a9448b7 commit 545a323

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

src/libp11-int.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,9 @@ struct pkcs11_ctx_private {
6161
CK_VERSION cryptoki_version;
6262
UI_METHOD *ui_method; /* UI_METHOD for CKU_CONTEXT_SPECIFIC PINs */
6363
void *ui_user_data;
64-
unsigned int forkid;
6564
pthread_mutex_t fork_lock;
65+
unsigned int forkid;
66+
int initialized;
6667
void (*vlog_a)(int, const char *, va_list); /* for the logging callback */
6768
};
6869
#define PRIVCTX(_ctx) ((PKCS11_CTX_private *) ((_ctx)->_private))

src/p11_load.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)