summaryrefslogtreecommitdiff
path: root/nss/lib/ssl/sslinit.c
diff options
context:
space:
mode:
Diffstat (limited to 'nss/lib/ssl/sslinit.c')
-rw-r--r--nss/lib/ssl/sslinit.c46
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;
}