aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/threading/thread.c
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2011-12-07 11:29:13 +0100
committerMartin Willi <martin@revosec.ch>2011-12-07 13:42:07 +0100
commit005b02cbe3546deb6caa32fc6c92a283256f207f (patch)
treeb07ecf7fa3bece51a75ce9ff76e6385f9b6f1efe /src/libstrongswan/threading/thread.c
parentdcb5c5906e1b967794f7927ffbde126ca2417954 (diff)
downloadstrongswan-005b02cbe3546deb6caa32fc6c92a283256f207f.tar.bz2
strongswan-005b02cbe3546deb6caa32fc6c92a283256f207f.tar.xz
Create a dummy pthread key for value "0", as some buggy PKCS#11 libraries mangle it
Diffstat (limited to 'src/libstrongswan/threading/thread.c')
-rw-r--r--src/libstrongswan/threading/thread.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/libstrongswan/threading/thread.c b/src/libstrongswan/threading/thread.c
index 5b6f0d2ce..d3da1e379 100644
--- a/src/libstrongswan/threading/thread.c
+++ b/src/libstrongswan/threading/thread.c
@@ -414,12 +414,20 @@ void thread_exit(void *val)
}
/**
+ * A dummy thread value that reserved pthread_key_t value "0". A buggy PKCS#11
+ * library mangles this key, without owning it, so we allocate it for them.
+ */
+static thread_value_t *dummy1;
+
+/**
* Described in header.
*/
void threads_init()
{
private_thread_t *main_thread = thread_create_internal();
+ dummy1 = thread_value_create(NULL);
+
main_thread->id = 0;
main_thread->thread_id = pthread_self();
current_thread = thread_value_create(NULL);
@@ -443,6 +451,8 @@ void threads_deinit()
{
private_thread_t *main_thread = (private_thread_t*)thread_current();
+ dummy1->destroy(dummy1);
+
main_thread->mutex->lock(main_thread->mutex);
thread_destroy(main_thread);
current_thread->destroy(current_thread);