summaryrefslogtreecommitdiff
path: root/p11-kit/rpc-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'p11-kit/rpc-client.c')
-rw-r--r--p11-kit/rpc-client.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/p11-kit/rpc-client.c b/p11-kit/rpc-client.c
index 23cfcfc..8607bb5 100644
--- a/p11-kit/rpc-client.c
+++ b/p11-kit/rpc-client.c
@@ -56,7 +56,7 @@
typedef struct {
p11_mutex_t mutex;
p11_rpc_client_vtable *vtable;
- pid_t initialized_pid;
+ unsigned int initialized_forkid;
bool initialize_done;
} rpc_client;
@@ -80,7 +80,7 @@ call_prepare (rpc_client *module,
assert (module != NULL);
assert (msg != NULL);
- if (module->initialized_pid == 0)
+ if (module->initialized_forkid != p11_forkid)
return CKR_CRYPTOKI_NOT_INITIALIZED;
if (!module->initialize_done)
return CKR_DEVICE_REMOVED;
@@ -850,7 +850,6 @@ rpc_C_Initialize (CK_X_FUNCTION_LIST *self,
void *reserved = NULL;
CK_RV ret = CKR_OK;
p11_rpc_message msg;
- pid_t pid;
assert (module != NULL);
p11_debug ("C_Initialize: enter");
@@ -886,10 +885,9 @@ rpc_C_Initialize (CK_X_FUNCTION_LIST *self,
p11_mutex_lock (&module->mutex);
- pid = getpid ();
- if (module->initialized_pid != 0) {
+ if (module->initialized_forkid != 0) {
/* This process has called C_Initialize already */
- if (pid == module->initialized_pid) {
+ if (p11_forkid == module->initialized_forkid) {
p11_message ("C_Initialize called twice for same process");
ret = CKR_CRYPTOKI_ALREADY_INITIALIZED;
goto done;
@@ -902,12 +900,12 @@ rpc_C_Initialize (CK_X_FUNCTION_LIST *self,
/* Successfully initialized */
if (ret == CKR_OK) {
- module->initialized_pid = pid;
+ module->initialized_forkid = p11_forkid;
module->initialize_done = true;
/* Server doesn't exist, initialize but don't call */
} else if (ret == CKR_DEVICE_REMOVED) {
- module->initialized_pid = pid;
+ module->initialized_forkid = p11_forkid;
module->initialize_done = false;
ret = CKR_OK;
goto done;
@@ -928,7 +926,7 @@ rpc_C_Initialize (CK_X_FUNCTION_LIST *self,
done:
/* If failed then unmark initialized */
if (ret != CKR_OK && ret != CKR_CRYPTOKI_ALREADY_INITIALIZED)
- module->initialized_pid = 0;
+ module->initialized_forkid = 0;
/* If we told our caller that we're initialized, but not really, then finalize */
if (ret != CKR_OK && module->initialize_done) {
@@ -952,7 +950,7 @@ rpc_C_Finalize (CK_X_FUNCTION_LIST *self,
p11_rpc_message msg;
p11_debug ("C_Finalize: enter");
- return_val_if_fail (module->initialized_pid != 0, CKR_CRYPTOKI_NOT_INITIALIZED);
+ return_val_if_fail (module->initialized_forkid == p11_forkid, CKR_CRYPTOKI_NOT_INITIALIZED);
return_val_if_fail (!reserved, CKR_ARGUMENTS_BAD);
p11_mutex_lock (&module->mutex);
@@ -970,7 +968,7 @@ rpc_C_Finalize (CK_X_FUNCTION_LIST *self,
(module->vtable->disconnect) (module->vtable, reserved);
}
- module->initialized_pid = 0;
+ module->initialized_forkid = 0;
p11_mutex_unlock (&module->mutex);