summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2011-08-08 20:21:47 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2011-08-08 22:33:34 +0200
commit2cfb179d19007a983869314e873ac347de542778 (patch)
treebe5d800038f6b9fc2f1423a855bf25d4de3aa0bb
parent589c804845b196047c8bdee48903efac5160c6b9 (diff)
downloadgnutls-2cfb179d19007a983869314e873ac347de542778.tar.gz
Prevent from loading twice the same module.
-rw-r--r--lib/pkcs11.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/pkcs11.c b/lib/pkcs11.c
index b26abe18d6..f5ce8ad5d4 100644
--- a/lib/pkcs11.c
+++ b/lib/pkcs11.c
@@ -181,12 +181,28 @@ pkcs11_rescan_slots (void)
static int
pkcs11_add_module (const char *name, struct ck_function_list *module)
{
+ struct ck_info info;
+ int i;
+
if (active_providers >= MAX_PROVIDERS)
{
gnutls_assert ();
return GNUTLS_E_CONSTRAINT_ERROR;
}
+ /* initially check if this module is a duplicate */
+ memset(&info, 0, sizeof(info));
+ pkcs11_get_module_info (module, &info);
+ for (i=0;i<active_providers;i++)
+ {
+ /* already loaded, skip the rest */
+ if (memcmp(&info, &providers[i].info, sizeof(info)) == 0)
+ {
+ _gnutls_debug_log("%s is already loaded.\n", name);
+ return 0;
+ }
+ }
+
active_providers++;
providers[active_providers - 1].module = module;
@@ -218,10 +234,7 @@ pkcs11_add_module (const char *name, struct ck_function_list *module)
goto fail;
}
- memset (&providers[active_providers - 1].info, 0,
- sizeof (providers[active_providers - 1].info));
- pkcs11_get_module_info (providers[active_providers - 1].module,
- &providers[active_providers - 1].info);
+ memcpy (&providers[active_providers - 1].info, &info, sizeof(info));
_gnutls_debug_log ("p11: loaded provider '%s' with %d slots\n",
name, (int) providers[active_providers - 1].nslots);