diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-08-08 20:21:47 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-08-08 22:33:34 +0200 |
commit | 2cfb179d19007a983869314e873ac347de542778 (patch) | |
tree | be5d800038f6b9fc2f1423a855bf25d4de3aa0bb | |
parent | 589c804845b196047c8bdee48903efac5160c6b9 (diff) | |
download | gnutls-2cfb179d19007a983869314e873ac347de542778.tar.gz |
Prevent from loading twice the same module.
-rw-r--r-- | lib/pkcs11.c | 21 |
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); |