| OLD | NEW |
| (Empty) |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
| 4 /* | |
| 5 * pkix_lifecycle.c | |
| 6 * | |
| 7 * Top level initialize and shutdown functions | |
| 8 * | |
| 9 */ | |
| 10 | |
| 11 #include "pkix_lifecycle.h" | |
| 12 | |
| 13 static PKIX_Boolean pkixIsInitialized; | |
| 14 | |
| 15 /* Lock used by Logger - is reentrant by the same thread */ | |
| 16 extern PKIX_PL_MonitorLock *pkixLoggerLock; | |
| 17 | |
| 18 /* | |
| 19 * Following pkix_* variables are for debugging purpose. They should be taken | |
| 20 * out eventually. The purpose is to verify cache tables usage (via debugger). | |
| 21 */ | |
| 22 int pkix_ccAddCount = 0; | |
| 23 int pkix_ccLookupCount = 0; | |
| 24 int pkix_ccRemoveCount = 0; | |
| 25 int pkix_cAddCount = 0; | |
| 26 int pkix_cLookupCount = 0; | |
| 27 int pkix_cRemoveCount = 0; | |
| 28 int pkix_ceAddCount = 0; | |
| 29 int pkix_ceLookupCount = 0; | |
| 30 | |
| 31 PKIX_PL_HashTable *cachedCrlSigTable = NULL; | |
| 32 PKIX_PL_HashTable *cachedCertSigTable = NULL; | |
| 33 PKIX_PL_HashTable *cachedCertChainTable = NULL; | |
| 34 PKIX_PL_HashTable *cachedCertTable = NULL; | |
| 35 PKIX_PL_HashTable *cachedCrlEntryTable = NULL; | |
| 36 PKIX_PL_HashTable *aiaConnectionCache = NULL; | |
| 37 PKIX_PL_HashTable *httpSocketCache = NULL; | |
| 38 | |
| 39 extern PKIX_List *pkixLoggers; | |
| 40 extern PKIX_List *pkixLoggersErrors; | |
| 41 extern PKIX_List *pkixLoggersDebugTrace; | |
| 42 | |
| 43 /* --Public-Functions--------------------------------------------- */ | |
| 44 | |
| 45 /* | |
| 46 * FUNCTION: PKIX_Initialize (see comments in pkix.h) | |
| 47 */ | |
| 48 PKIX_Error * | |
| 49 PKIX_Initialize( | |
| 50 PKIX_Boolean platformInitNeeded, | |
| 51 PKIX_UInt32 desiredMajorVersion, | |
| 52 PKIX_UInt32 minDesiredMinorVersion, | |
| 53 PKIX_UInt32 maxDesiredMinorVersion, | |
| 54 PKIX_UInt32 *pActualMinorVersion, | |
| 55 void **pPlContext) | |
| 56 { | |
| 57 void *plContext = NULL; | |
| 58 | |
| 59 PKIX_ENTER(LIFECYCLE, "PKIX_Initialize"); | |
| 60 PKIX_NULLCHECK_ONE(pPlContext); | |
| 61 | |
| 62 /* | |
| 63 * If we are called a second time other than in the situation handled | |
| 64 * above, we return a positive status. | |
| 65 */ | |
| 66 if (pkixIsInitialized){ | |
| 67 /* Already initialized */ | |
| 68 PKIX_RETURN(LIFECYCLE); | |
| 69 } | |
| 70 | |
| 71 PKIX_CHECK(PKIX_PL_Initialize | |
| 72 (platformInitNeeded, PKIX_FALSE, &plContext), | |
| 73 PKIX_INITIALIZEFAILED); | |
| 74 | |
| 75 *pPlContext = plContext; | |
| 76 | |
| 77 if (desiredMajorVersion != PKIX_MAJOR_VERSION){ | |
| 78 PKIX_ERROR(PKIX_MAJORVERSIONSDONTMATCH); | |
| 79 } | |
| 80 | |
| 81 if ((minDesiredMinorVersion > PKIX_MINOR_VERSION) || | |
| 82 (maxDesiredMinorVersion < PKIX_MINOR_VERSION)){ | |
| 83 PKIX_ERROR(PKIX_MINORVERSIONNOTBETWEENDESIREDMINANDMAX); | |
| 84 } | |
| 85 | |
| 86 *pActualMinorVersion = PKIX_MINOR_VERSION; | |
| 87 | |
| 88 /* Create Cache Tables | |
| 89 * Do not initialize hash tables for object leak test */ | |
| 90 #if !defined(PKIX_OBJECT_LEAK_TEST) | |
| 91 PKIX_CHECK(PKIX_PL_HashTable_Create | |
| 92 (32, 0, &cachedCertSigTable, plContext), | |
| 93 PKIX_HASHTABLECREATEFAILED); | |
| 94 | |
| 95 PKIX_CHECK(PKIX_PL_HashTable_Create | |
| 96 (32, 0, &cachedCrlSigTable, plContext), | |
| 97 PKIX_HASHTABLECREATEFAILED); | |
| 98 | |
| 99 PKIX_CHECK(PKIX_PL_HashTable_Create | |
| 100 (32, 10, &cachedCertChainTable, plContext), | |
| 101 PKIX_HASHTABLECREATEFAILED); | |
| 102 | |
| 103 PKIX_CHECK(PKIX_PL_HashTable_Create | |
| 104 (32, 10, &cachedCertTable, plContext), | |
| 105 PKIX_HASHTABLECREATEFAILED); | |
| 106 | |
| 107 PKIX_CHECK(PKIX_PL_HashTable_Create | |
| 108 (32, 10, &cachedCrlEntryTable, plContext), | |
| 109 PKIX_HASHTABLECREATEFAILED); | |
| 110 | |
| 111 PKIX_CHECK(PKIX_PL_HashTable_Create | |
| 112 (5, 5, &aiaConnectionCache, plContext), | |
| 113 PKIX_HASHTABLECREATEFAILED); | |
| 114 | |
| 115 #ifdef PKIX_SOCKETCACHE | |
| 116 PKIX_CHECK(PKIX_PL_HashTable_Create | |
| 117 (5, 5, &httpSocketCache, plContext), | |
| 118 PKIX_HASHTABLECREATEFAILED); | |
| 119 #endif | |
| 120 if (pkixLoggerLock == NULL) { | |
| 121 PKIX_CHECK(PKIX_PL_MonitorLock_Create | |
| 122 (&pkixLoggerLock, plContext), | |
| 123 PKIX_MONITORLOCKCREATEFAILED); | |
| 124 } | |
| 125 #else | |
| 126 fnInvTable = PL_NewHashTable(0, pkix_ErrorGen_Hash, | |
| 127 PL_CompareValues, | |
| 128 PL_CompareValues, NULL, NULL); | |
| 129 if (!fnInvTable) { | |
| 130 PKIX_ERROR(PKIX_HASHTABLECREATEFAILED); | |
| 131 } | |
| 132 | |
| 133 fnStackNameArr = PORT_ZNewArray(char*, MAX_STACK_DEPTH); | |
| 134 if (!fnStackNameArr) { | |
| 135 PKIX_ERROR(PKIX_HASHTABLECREATEFAILED); | |
| 136 } | |
| 137 | |
| 138 fnStackInvCountArr = PORT_ZNewArray(PKIX_UInt32, MAX_STACK_DEPTH); | |
| 139 if (!fnStackInvCountArr) { | |
| 140 PKIX_ERROR(PKIX_HASHTABLECREATEFAILED); | |
| 141 } | |
| 142 #endif /* PKIX_OBJECT_LEAK_TEST */ | |
| 143 | |
| 144 pkixIsInitialized = PKIX_TRUE; | |
| 145 | |
| 146 cleanup: | |
| 147 | |
| 148 PKIX_RETURN(LIFECYCLE); | |
| 149 } | |
| 150 | |
| 151 /* | |
| 152 * FUNCTION: PKIX_Shutdown (see comments in pkix.h) | |
| 153 */ | |
| 154 PKIX_Error * | |
| 155 PKIX_Shutdown(void *plContext) | |
| 156 { | |
| 157 PKIX_List *savedPkixLoggers = NULL; | |
| 158 PKIX_List *savedPkixLoggersErrors = NULL; | |
| 159 PKIX_List *savedPkixLoggersDebugTrace = NULL; | |
| 160 | |
| 161 PKIX_ENTER(LIFECYCLE, "PKIX_Shutdown"); | |
| 162 | |
| 163 if (!pkixIsInitialized){ | |
| 164 /* The library was not initialized */ | |
| 165 PKIX_RETURN(LIFECYCLE); | |
| 166 } | |
| 167 | |
| 168 pkixIsInitialized = PKIX_FALSE; | |
| 169 | |
| 170 if (pkixLoggers) { | |
| 171 savedPkixLoggers = pkixLoggers; | |
| 172 savedPkixLoggersErrors = pkixLoggersErrors; | |
| 173 savedPkixLoggersDebugTrace = pkixLoggersDebugTrace; | |
| 174 pkixLoggers = NULL; | |
| 175 pkixLoggersErrors = NULL; | |
| 176 pkixLoggersDebugTrace = NULL; | |
| 177 PKIX_DECREF(savedPkixLoggers); | |
| 178 PKIX_DECREF(savedPkixLoggersErrors); | |
| 179 PKIX_DECREF(savedPkixLoggersDebugTrace); | |
| 180 } | |
| 181 PKIX_DECREF(pkixLoggerLock); | |
| 182 | |
| 183 /* Destroy Cache Tables */ | |
| 184 PKIX_DECREF(cachedCertSigTable); | |
| 185 PKIX_DECREF(cachedCrlSigTable); | |
| 186 PKIX_DECREF(cachedCertChainTable); | |
| 187 PKIX_DECREF(cachedCertTable); | |
| 188 PKIX_DECREF(cachedCrlEntryTable); | |
| 189 PKIX_DECREF(aiaConnectionCache); | |
| 190 PKIX_DECREF(httpSocketCache); | |
| 191 | |
| 192 /* Clean up any temporary errors that happened during shutdown */ | |
| 193 if (pkixErrorList) { | |
| 194 PKIX_PL_Object_DecRef((PKIX_PL_Object*)pkixErrorList, plContext); | |
| 195 pkixErrorList = NULL; | |
| 196 } | |
| 197 | |
| 198 PKIX_CHECK(PKIX_PL_Shutdown(plContext), | |
| 199 PKIX_SHUTDOWNFAILED); | |
| 200 | |
| 201 #ifdef PKIX_OBJECT_LEAK_TEST | |
| 202 PORT_Free(fnStackInvCountArr); | |
| 203 PORT_Free(fnStackNameArr); | |
| 204 PL_HashTableDestroy(fnInvTable); | |
| 205 #endif | |
| 206 | |
| 207 cleanup: | |
| 208 | |
| 209 PKIX_RETURN(LIFECYCLE); | |
| 210 } | |
| OLD | NEW |