From 513a1a2835d94a7b409b40051628c7a2d1107af3 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Thu, 4 Jun 2009 15:49:19 +0200 Subject: [PATCH] initialize gcrypt threadsave, currently for pthread only --- .../plugins/gcrypt/gcrypt_plugin.c | 26 ++++++++++++++++++- src/libstrongswan/utils/leak_detective.c | 3 +++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/libstrongswan/plugins/gcrypt/gcrypt_plugin.c b/src/libstrongswan/plugins/gcrypt/gcrypt_plugin.c index 1b3c66d1d..c31dbe33d 100644 --- a/src/libstrongswan/plugins/gcrypt/gcrypt_plugin.c +++ b/src/libstrongswan/plugins/gcrypt/gcrypt_plugin.c @@ -16,6 +16,11 @@ #include "gcrypt_plugin.h" #include +#include + +#include +#include +#include typedef struct private_gcrypt_plugin_t private_gcrypt_plugin_t; @@ -30,6 +35,11 @@ struct private_gcrypt_plugin_t { gcrypt_plugin_t public; }; +/** + * Thread callback implementations for pthread + */ +GCRY_THREAD_OPTION_PTHREAD_IMPL; + /** * Implementation of gcrypt_plugin_t.destroy */ @@ -43,7 +53,21 @@ static void destroy(private_gcrypt_plugin_t *this) */ plugin_t *plugin_create() { - private_gcrypt_plugin_t *this = malloc_thing(private_gcrypt_plugin_t); + private_gcrypt_plugin_t *this; + + gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); + + if (!gcry_check_version(GCRYPT_VERSION)) + { + DBG1("libgcrypt version mismatch"); + return NULL; + } + + /* we currently do not use secure memory */ + gcry_control(GCRYCTL_DISABLE_SECMEM, 0); + gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); + + this = malloc_thing(private_gcrypt_plugin_t); this->public.plugin.destroy = (void(*)(plugin_t*))destroy; diff --git a/src/libstrongswan/utils/leak_detective.c b/src/libstrongswan/utils/leak_detective.c index 65317e37c..2e7b7c0b7 100644 --- a/src/libstrongswan/utils/leak_detective.c +++ b/src/libstrongswan/utils/leak_detective.c @@ -200,6 +200,9 @@ char *whitelist[] = { "DH_new_method", "ENGINE_load_builtin_engines", "OPENSSL_config", + /* libgcrypt */ + "gcry_control", + "gcry_check_version", }; /**