--- curl-7.18.2/lib/nss.c.orig 2008-12-03 16:39:41.000000000 -0500 +++ curl-7.18.2/lib/nss.c 2008-12-03 18:26:06.000000000 -0500 @@ -73,6 +73,8 @@ PRFileDesc *PR_ImportTCPSocket(PRInt32 osfd); +PRLock * nss_initlock = NULL; + int initialized = 0; #define HANDSHAKE_TIMEOUT 30 @@ -229,6 +231,23 @@ } /* + * Get the number of ciphers that are enabled. We use this to determine + * if we need to call NSS_SetDomesticPolicy() to enable the default ciphers. + */ +static int num_enabled_ciphers() { + PRInt32 policy = 0; + int count = 0; + int i; + + for(i=0; idata, "Unable to initialize NSS database\n"); - curlerr = CURLE_SSL_CACERT_BADFILE; - goto error; + if (!NSS_IsInitialized()) { + initialized = 1; + if(!certDir) { + rv = NSS_NoDB_Init(NULL); + } + else { + rv = NSS_Initialize(certDir, NULL, NULL, "secmod.db", + NSS_INIT_READONLY); + } + if(rv != SECSuccess) { + infof(conn->data, "Unable to initialize NSS database\n"); + curlerr = CURLE_SSL_CACERT_BADFILE; + PR_Unlock(nss_initlock); + initialized = 0; + goto error; + } } - - NSS_SetDomesticPolicy(); + if(num_enabled_ciphers() == 0) + NSS_SetDomesticPolicy(); #ifdef HAVE_PK11_CREATEGENERICOBJECT configstring = (char *)malloc(PATH_MAX); @@ -854,6 +891,7 @@ } #endif } + PR_Unlock(nss_initlock); model = PR_NewTCPSocket(); if(!model)