summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStef Walter <stefw@gnome.org>2012-01-23 09:09:31 +0100
committerStef Walter <stefw@gnome.org>2012-01-23 18:04:58 +0100
commit53c34e8ff80500d6ef9366453e88c27a3a52ee46 (patch)
tree7db7175d5c0a302c751c937483acefd033e0757d
parent001d59596a37369d094edcace455f611d9f55908 (diff)
downloadp11-kit-53c34e8ff80500d6ef9366453e88c27a3a52ee46.tar.gz
Remove automatic reinitialization of PKCS#11 after fork
* First of all one should only call async-signal-safe functions from the callbacks of pthread_atfork(), and so we cannot reinitialize directly. * Some modules use pthread_atfork() to detect forking and setup their internal state. If we call into them in our pthread_atfork() callback then this is inherently racy. * There was danger of endless loops and deadlocks which are caused by handlers which fork in their C_Initialize * Many processes do fork/exec, reinitializing PKCS#11 for these forks is quite resourc intensive when the child process won't use PKCS#11 at all.
-rw-r--r--p11-kit/modules.c11
1 files changed, 2 insertions, 9 deletions
diff --git a/p11-kit/modules.c b/p11-kit/modules.c
index c0660c7..047a2ca 100644
--- a/p11-kit/modules.c
+++ b/p11-kit/modules.c
@@ -541,21 +541,14 @@ reinitialize_after_fork (void)
hashiter iter;
Module *mod;
- /* WARNING: This function must be reentrant */
_p11_debug ("forked");
_p11_lock ();
if (gl.modules) {
_p11_hash_iterate (gl.modules, &iter);
- while (_p11_hash_next (&iter, NULL, (void **)&mod)) {
- if (mod->initialize_called) {
- mod->initialize_called = 0;
-
- /* WARNING: Reentrancy can occur here */
- initialize_module_unlocked_reentrant (mod);
- }
- }
+ while (_p11_hash_next (&iter, NULL, (void **)&mod))
+ mod->initialize_called = 0;
}
_p11_unlock ();