initialize gcrypt threadsave, currently for pthread only
authorMartin Willi <martin@strongswan.org>
Thu, 4 Jun 2009 13:49:19 +0000 (15:49 +0200)
committerMartin Willi <martin@strongswan.org>
Tue, 9 Jun 2009 09:18:56 +0000 (11:18 +0200)
src/libstrongswan/plugins/gcrypt/gcrypt_plugin.c
src/libstrongswan/utils/leak_detective.c

index 1b3c66d..c31dbe3 100644 (file)
 #include "gcrypt_plugin.h"
 
 #include <library.h>
+#include <debug.h>
+
+#include <errno.h>
+#include <gcrypt.h>
+#include <pthread.h>
 
 typedef struct private_gcrypt_plugin_t private_gcrypt_plugin_t;
 
@@ -31,6 +36,11 @@ struct private_gcrypt_plugin_t {
 };
 
 /**
+ * Thread callback implementations for pthread
+ */
+GCRY_THREAD_OPTION_PTHREAD_IMPL;
+
+/**
  * Implementation of gcrypt_plugin_t.destroy
  */
 static void destroy(private_gcrypt_plugin_t *this)
@@ -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;
        
index 65317e3..2e7b7c0 100644 (file)
@@ -200,6 +200,9 @@ char *whitelist[] = {
        "DH_new_method",
        "ENGINE_load_builtin_engines",
        "OPENSSL_config",
+       /* libgcrypt */
+       "gcry_control",
+       "gcry_check_version",
 };
 
 /**