diff -up NetworkManager-0.7.0/libnm-util/crypto_nss.c.crypto-init NetworkManager-0.7.0/libnm-util/crypto_nss.c --- NetworkManager-0.7.0/libnm-util/crypto_nss.c.crypto-init 2008-08-22 12:14:12.000000000 -0400 +++ NetworkManager-0.7.0/libnm-util/crypto_nss.c 2008-09-11 16:22:29.000000000 -0400 @@ -29,27 +29,39 @@ #include #include #include +#include #include "crypto.h" -static guint32 refcount = 0; +static gboolean initialized = FALSE; gboolean crypto_init (GError **error) { - if (refcount == 0) { - PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 1); - NSS_NoDB_Init (NULL); + SECStatus ret; + + if (initialized) + return TRUE; + + PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 1); + ret = NSS_NoDB_Init (NULL); + if (ret != SECSuccess) { + PR_Cleanup (); + g_set_error (error, NM_CRYPTO_ERROR, + 0, + _("Failed to initialize the crypto engine: %d."), + PR_GetError ()); + return FALSE; } - refcount++; + + initialized = TRUE; return TRUE; } void crypto_deinit (void) { - refcount--; - if (refcount == 0) { + if (initialized) { NSS_Shutdown (); PR_Cleanup (); } diff -up NetworkManager-0.7.0/libnm-util/nm-utils.c.crypto-init NetworkManager-0.7.0/libnm-util/nm-utils.c --- NetworkManager-0.7.0/libnm-util/nm-utils.c.crypto-init 2008-08-22 12:14:12.000000000 -0400 +++ NetworkManager-0.7.0/libnm-util/nm-utils.c 2008-09-11 16:19:25.000000000 -0400 @@ -1152,7 +1152,6 @@ nm_utils_uuid_generate_from_string (cons out: g_free (uuid); - crypto_deinit (); return buf; }