diff options
Diffstat (limited to 'nss/lib/ssl/sslinit.c')
-rw-r--r-- | nss/lib/ssl/sslinit.c | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/nss/lib/ssl/sslinit.c b/nss/lib/ssl/sslinit.c index bb9df25..0f38c0b 100644 --- a/nss/lib/ssl/sslinit.c +++ b/nss/lib/ssl/sslinit.c @@ -11,23 +11,49 @@ #include "secerr.h" #include "ssl.h" #include "sslimpl.h" +#include "sslproto.h" -static int ssl_inited = 0; +static int ssl_isInited = 0; +static PRCallOnceType ssl_init = { 0 }; -SECStatus -ssl_Init(void) +PRStatus +ssl_InitCallOnce(void *arg) { - if (!ssl_inited) { - if (ssl_InitializePRErrorTable() != SECSuccess) { - PORT_SetError(SEC_ERROR_NO_MEMORY); - return (SECFailure); - } + int *error = (int *)arg; + SECStatus rv; + rv = ssl_InitializePRErrorTable(); + if (rv != SECSuccess) { + *error = SEC_ERROR_NO_MEMORY; + return PR_FAILURE; + } #ifdef DEBUG - ssl3_CheckCipherSuiteOrderConsistency(); + ssl3_CheckCipherSuiteOrderConsistency(); #endif - ssl_inited = 1; + rv = ssl3_ApplyNSSPolicy(); + if (rv != SECSuccess) { + *error = PORT_GetError(); + return PR_FAILURE; + } + return PR_SUCCESS; +} + +SECStatus +ssl_Init(void) +{ + PRStatus nrv; + + /* short circuit test if we are already inited */ + if (!ssl_isInited) { + int error; + /* only do this once at init time, block all others until we are done */ + nrv = PR_CallOnceWithArg(&ssl_init, ssl_InitCallOnce, &error); + if (nrv != PR_SUCCESS) { + PORT_SetError(error); + return SECFailure; + } + ssl_isInited = 1; } return SECSuccess; } |