OLD | NEW |
1 /* This Source Code Form is subject to the terms of the Mozilla Public | 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 | 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/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 /* | 4 /* |
5 * pkix_pl_lifecycle.c | 5 * pkix_pl_lifecycle.c |
6 * | 6 * |
7 * Lifecycle Functions for the PKIX PL library. | 7 * Lifecycle Functions for the PKIX PL library. |
8 * | 8 * |
9 */ | 9 */ |
10 | 10 |
11 #include "pkix_pl_lifecycle.h" | 11 #include "pkix_pl_lifecycle.h" |
12 | 12 |
13 PKIX_Boolean pkix_pl_initialized = PKIX_FALSE; | 13 PKIX_Boolean pkix_pl_initialized = PKIX_FALSE; |
14 pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; | 14 pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; |
15 PRLock *classTableLock; | 15 PRLock *classTableLock; |
16 PRLogModuleInfo *pkixLog = NULL; | 16 PRLogModuleInfo *pkixLog = NULL; |
17 | 17 |
18 /* | 18 /* |
19 * PKIX_ALLOC_ERROR is a special error object hard-coded into the | 19 * PKIX_ALLOC_ERROR is a special error object hard-coded into the |
20 * pkix_error.o object file. It is thrown if system memory cannot be | 20 * pkix_error.o object file. It is thrown if system memory cannot be |
21 * allocated. PKIX_ALLOC_ERROR is immutable. | 21 * allocated. PKIX_ALLOC_ERROR is immutable. |
22 * IncRef, DecRef, and Settor functions cannot be called. | 22 * IncRef, DecRef, and Settor functions cannot be called. |
23 */ | 23 */ |
24 | 24 |
25 /* Keep this structure definition here for its is used only once here */ | 25 /* Keep this structure definition here for its is used only once here */ |
26 struct PKIX_Alloc_Error_ObjectStruct { | 26 struct PKIX_Alloc_Error_ObjectStruct { |
27 PKIX_PL_Object header; | 27 PKIX_PL_Object header; |
28 PKIX_Error error; | 28 PKIX_Error error; |
29 }; | 29 }; |
30 typedef struct PKIX_Alloc_Error_ObjectStruct PKIX_Alloc_Error_Object; | 30 typedef struct PKIX_Alloc_Error_ObjectStruct PKIX_Alloc_Error_Object; |
31 | 31 |
32 static const PKIX_Alloc_Error_Object pkix_Alloc_Error_Data = { | 32 static const PKIX_Alloc_Error_Object pkix_Alloc_Error_Data = { |
33 { | 33 {PKIX_MAGIC_HEADER, /* PRUint64 magicHeader */ |
34 PKIX_MAGIC_HEADER, » » /* PRUint64 magicHeader */ | 34 (PKIX_UInt32)PKIX_ERROR_TYPE, /* PKIX_UInt32 type */ |
35 (PKIX_UInt32)PKIX_ERROR_TYPE, /* PKIX_UInt32 type */ | 35 (PKIX_UInt32)1, /* PKIX_UInt32 references */ |
36 (PKIX_UInt32)1, /* PKIX_UInt32 references */ | 36 /* Warning! Cannot Ref Count with NULL lock */ |
37 /* Warning! Cannot Ref Count with NULL lock */ | 37 (void *)0, /* PRLock *lock */ |
38 (void *)0, /* PRLock *lock */ | 38 (PKIX_PL_String *)0, /* PKIX_PL_String *stringRep */ |
39 (PKIX_PL_String *)0, /* PKIX_PL_String *stringRep */ | 39 (PKIX_UInt32)0, /* PKIX_UInt32 hashcode */ |
40 (PKIX_UInt32)0, /* PKIX_UInt32 hashcode */ | 40 (PKIX_Boolean)PKIX_FALSE, /* PKIX_Boolean hashcodeCached */ |
41 (PKIX_Boolean)PKIX_FALSE, /* PKIX_Boolean hashcodeCached */ | 41 }, |
42 }, { | 42 {(PKIX_ERRORCODE)0, /* PKIX_ERRORCODE errCode; */ |
43 (PKIX_ERRORCODE)0, /* PKIX_ERRORCODE errCode; */ | 43 (PKIX_ERRORCLASS)PKIX_FATAL_ERROR, /* PKIX_ERRORCLASS errClass */ |
44 (PKIX_ERRORCLASS)PKIX_FATAL_ERROR,/* PKIX_ERRORCLASS errClass */ | 44 (PKIX_UInt32)SEC_ERROR_LIBPKIX_INTERNAL, /* default PL Error Code */ |
45 (PKIX_UInt32)SEC_ERROR_LIBPKIX_INTERNAL, /* default PL Error Code */ | 45 (PKIX_Error *)0, /* PKIX_Error *cause */ |
46 (PKIX_Error *)0, /* PKIX_Error *cause */ | 46 (PKIX_PL_Object *)0, /* PKIX_PL_Object *info */ |
47 (PKIX_PL_Object *)0, /* PKIX_PL_Object *info */ | 47 }}; |
48 } | 48 |
49 }; | 49 PKIX_Error *PKIX_ALLOC_ERROR(void) { |
50 | 50 return (PKIX_Error *)&pkix_Alloc_Error_Data.error; |
51 PKIX_Error* PKIX_ALLOC_ERROR(void) | |
52 { | |
53 return (PKIX_Error *)&pkix_Alloc_Error_Data.error; | |
54 } | 51 } |
55 | 52 |
56 #ifdef PKIX_OBJECT_LEAK_TEST | 53 #ifdef PKIX_OBJECT_LEAK_TEST |
57 SECStatus | 54 SECStatus pkix_pl_lifecycle_ObjectTableUpdate(int *objCountTable) { |
58 pkix_pl_lifecycle_ObjectTableUpdate(int *objCountTable) | 55 int typeCounter = 0; |
59 { | 56 |
60 int typeCounter = 0; | 57 for (; typeCounter < PKIX_NUMTYPES; typeCounter++) { |
61 | 58 pkix_ClassTable_Entry *entry = &systemClasses[typeCounter]; |
62 for (; typeCounter < PKIX_NUMTYPES; typeCounter++) { | 59 |
63 pkix_ClassTable_Entry *entry = &systemClasses[typeCounter]; | 60 objCountTable[typeCounter] = entry->objCounter; |
64 | 61 } |
65 objCountTable[typeCounter] = entry->objCounter; | 62 |
| 63 return SECSuccess; |
| 64 } |
| 65 #endif /* PKIX_OBJECT_LEAK_TEST */ |
| 66 |
| 67 PKIX_UInt32 pkix_pl_lifecycle_ObjectLeakCheck(int *initObjCountTable) { |
| 68 int typeCounter = 0; |
| 69 PKIX_UInt32 numObjects = 0; |
| 70 char classNameBuff[128]; |
| 71 char *className = NULL; |
| 72 |
| 73 for (; typeCounter < PKIX_NUMTYPES; typeCounter++) { |
| 74 pkix_ClassTable_Entry *entry = &systemClasses[typeCounter]; |
| 75 PKIX_UInt32 objCountDiff = entry->objCounter; |
| 76 |
| 77 if (initObjCountTable) { |
| 78 PKIX_UInt32 initialCount = initObjCountTable[typeCounter]; |
| 79 objCountDiff = (entry->objCounter > initialCount) |
| 80 ? entry->objCounter - initialCount |
| 81 : 0; |
66 } | 82 } |
67 | 83 |
68 return SECSuccess; | 84 numObjects += objCountDiff; |
69 } | 85 |
70 #endif /* PKIX_OBJECT_LEAK_TEST */ | 86 if (!pkixLog || !objCountDiff) { |
71 | 87 continue; |
72 | 88 } |
73 PKIX_UInt32 | 89 className = entry->description; |
74 pkix_pl_lifecycle_ObjectLeakCheck(int *initObjCountTable) | 90 if (!className) { |
75 { | 91 className = classNameBuff; |
76 int typeCounter = 0; | 92 PR_snprintf(className, 128, "Unknown(ref %d)", entry->objCounter); |
77 PKIX_UInt32 numObjects = 0; | 93 } |
78 char classNameBuff[128]; | 94 |
79 char *className = NULL; | 95 PR_LOG(pkixLog, 1, ("Class %s leaked %d objects of " |
80 | 96 "size %d bytes, total = %d bytes\n", |
81 for (; typeCounter < PKIX_NUMTYPES; typeCounter++) { | 97 className, objCountDiff, entry->typeObjectSize, |
82 pkix_ClassTable_Entry *entry = &systemClasses[typeCounter]; | |
83 PKIX_UInt32 objCountDiff = entry->objCounter; | |
84 | |
85 if (initObjCountTable) { | |
86 PKIX_UInt32 initialCount = initObjCountTable[typeCounter]; | |
87 objCountDiff = (entry->objCounter > initialCount) ? | |
88 entry->objCounter - initialCount : 0; | |
89 } | |
90 | |
91 numObjects += objCountDiff; | |
92 ················ | |
93 if (!pkixLog || !objCountDiff) { | |
94 continue; | |
95 } | |
96 className = entry->description; | |
97 if (!className) { | |
98 className = classNameBuff; | |
99 PR_snprintf(className, 128, "Unknown(ref %d)",· | |
100 entry->objCounter); | |
101 } | |
102 | |
103 PR_LOG(pkixLog, 1, ("Class %s leaked %d objects of " | |
104 "size %d bytes, total = %d bytes\n", className,· | |
105 objCountDiff, entry->typeObjectSize, | |
106 objCountDiff * entry->typeObjectSize)); | 98 objCountDiff * entry->typeObjectSize)); |
107 } | 99 } |
108 | 100 |
109 return numObjects; | 101 return numObjects; |
110 } | 102 } |
111 | 103 |
112 /* | 104 /* |
113 * PKIX_PL_Initialize (see comments in pkix_pl_system.h) | 105 * PKIX_PL_Initialize (see comments in pkix_pl_system.h) |
114 */ | 106 */ |
115 PKIX_Error * | 107 PKIX_Error *PKIX_PL_Initialize(PKIX_Boolean platformInitNeeded, |
116 PKIX_PL_Initialize( | 108 PKIX_Boolean useArenas, void **pPlContext) { |
117 PKIX_Boolean platformInitNeeded, | 109 void *plContext = NULL; |
118 PKIX_Boolean useArenas, | 110 |
119 void **pPlContext) | 111 PKIX_ENTER(OBJECT, "PKIX_PL_Initialize"); |
120 { | 112 |
121 void *plContext = NULL; | 113 /* |
122 | 114 * This function can only be called once. If it has already been |
123 PKIX_ENTER(OBJECT, "PKIX_PL_Initialize"); | 115 * called, we return a positive status. |
124 | 116 */ |
125 /* | 117 if (pkix_pl_initialized) { |
126 * This function can only be called once. If it has already been | 118 PKIX_RETURN(OBJECT); |
127 * called, we return a positive status. | 119 } |
128 */ | 120 |
129 if (pkix_pl_initialized) { | 121 classTableLock = PR_NewLock(); |
130 PKIX_RETURN(OBJECT); | 122 if (classTableLock == NULL) { |
131 } | 123 return PKIX_ALLOC_ERROR(); |
132 | 124 } |
133 classTableLock = PR_NewLock(); | 125 |
134 if (classTableLock == NULL) { | 126 if (PR_GetEnv("NSS_STRICT_SHUTDOWN")) { |
135 return PKIX_ALLOC_ERROR(); | 127 pkixLog = PR_NewLogModule("pkix"); |
136 } | 128 } |
137 | 129 /* |
138 if (PR_GetEnv("NSS_STRICT_SHUTDOWN")) { | 130 * Register Object, it is the base object of all other objects. |
139 pkixLog = PR_NewLogModule("pkix"); | 131 */ |
140 } | 132 pkix_pl_Object_RegisterSelf(plContext); |
141 /* | 133 |
142 * Register Object, it is the base object of all other objects. | 134 /* |
143 */ | 135 * Register Error and String, since they will be needed if |
144 pkix_pl_Object_RegisterSelf(plContext); | 136 * there is a problem in registering any other type. |
145 | 137 */ |
146 /* | 138 pkix_Error_RegisterSelf(plContext); |
147 * Register Error and String, since they will be needed if | 139 pkix_pl_String_RegisterSelf(plContext); |
148 * there is a problem in registering any other type. | 140 |
149 */ | 141 /* |
150 pkix_Error_RegisterSelf(plContext); | 142 * We register all other system types |
151 pkix_pl_String_RegisterSelf(plContext); | 143 * (They don't need to be in order, but it's |
152 | 144 * easier to keep track of what types are registered |
153 | 145 * if we register them in the same order as their |
154 /* | 146 * numbers, defined in pkixt.h. |
155 * We register all other system types | 147 */ |
156 * (They don't need to be in order, but it's | 148 pkix_pl_BigInt_RegisterSelf(plContext); /* 1-10 */ |
157 * easier to keep track of what types are registered | 149 pkix_pl_ByteArray_RegisterSelf(plContext); |
158 * if we register them in the same order as their | 150 pkix_pl_HashTable_RegisterSelf(plContext); |
159 * numbers, defined in pkixt.h. | 151 pkix_List_RegisterSelf(plContext); |
160 */ | 152 pkix_Logger_RegisterSelf(plContext); |
161 pkix_pl_BigInt_RegisterSelf(plContext); /* 1-10 */ | 153 pkix_pl_Mutex_RegisterSelf(plContext); |
162 pkix_pl_ByteArray_RegisterSelf(plContext); | 154 pkix_pl_OID_RegisterSelf(plContext); |
163 pkix_pl_HashTable_RegisterSelf(plContext); | 155 pkix_pl_RWLock_RegisterSelf(plContext); |
164 pkix_List_RegisterSelf(plContext); | 156 |
165 pkix_Logger_RegisterSelf(plContext); | 157 pkix_pl_CertBasicConstraints_RegisterSelf(plContext); /* 11-20 */ |
166 pkix_pl_Mutex_RegisterSelf(plContext); | 158 pkix_pl_Cert_RegisterSelf(plContext); |
167 pkix_pl_OID_RegisterSelf(plContext); | 159 pkix_pl_CRL_RegisterSelf(plContext); |
168 pkix_pl_RWLock_RegisterSelf(plContext); | 160 pkix_pl_CRLEntry_RegisterSelf(plContext); |
169 | 161 pkix_pl_Date_RegisterSelf(plContext); |
170 pkix_pl_CertBasicConstraints_RegisterSelf(plContext); /* 11-20 */ | 162 pkix_pl_GeneralName_RegisterSelf(plContext); |
171 pkix_pl_Cert_RegisterSelf(plContext); | 163 pkix_pl_CertNameConstraints_RegisterSelf(plContext); |
172 pkix_pl_CRL_RegisterSelf(plContext); | 164 pkix_pl_PublicKey_RegisterSelf(plContext); |
173 pkix_pl_CRLEntry_RegisterSelf(plContext); | 165 pkix_TrustAnchor_RegisterSelf(plContext); |
174 pkix_pl_Date_RegisterSelf(plContext); | 166 |
175 pkix_pl_GeneralName_RegisterSelf(plContext); | 167 pkix_pl_X500Name_RegisterSelf(plContext); /* 21-30 */ |
176 pkix_pl_CertNameConstraints_RegisterSelf(plContext); | 168 pkix_pl_HttpCertStoreContext_RegisterSelf(plContext); |
177 pkix_pl_PublicKey_RegisterSelf(plContext); | 169 pkix_BuildResult_RegisterSelf(plContext); |
178 pkix_TrustAnchor_RegisterSelf(plContext); | 170 pkix_ProcessingParams_RegisterSelf(plContext); |
179 | 171 pkix_ValidateParams_RegisterSelf(plContext); |
180 pkix_pl_X500Name_RegisterSelf(plContext); /* 21-30 */ | 172 pkix_ValidateResult_RegisterSelf(plContext); |
181 pkix_pl_HttpCertStoreContext_RegisterSelf(plContext); | 173 pkix_CertStore_RegisterSelf(plContext); |
182 pkix_BuildResult_RegisterSelf(plContext); | 174 pkix_CertChainChecker_RegisterSelf(plContext); |
183 pkix_ProcessingParams_RegisterSelf(plContext); | 175 pkix_RevocationChecker_RegisterSelf(plContext); |
184 pkix_ValidateParams_RegisterSelf(plContext); | 176 pkix_CertSelector_RegisterSelf(plContext); |
185 pkix_ValidateResult_RegisterSelf(plContext); | 177 |
186 pkix_CertStore_RegisterSelf(plContext); | 178 pkix_ComCertSelParams_RegisterSelf(plContext); /* 31-40 */ |
187 pkix_CertChainChecker_RegisterSelf(plContext); | 179 pkix_CRLSelector_RegisterSelf(plContext); |
188 pkix_RevocationChecker_RegisterSelf(plContext); | 180 pkix_ComCRLSelParams_RegisterSelf(plContext); |
189 pkix_CertSelector_RegisterSelf(plContext); | 181 pkix_pl_CertPolicyInfo_RegisterSelf(plContext); |
190 | 182 pkix_pl_CertPolicyQualifier_RegisterSelf(plContext); |
191 pkix_ComCertSelParams_RegisterSelf(plContext); /* 31-40 */ | 183 pkix_pl_CertPolicyMap_RegisterSelf(plContext); |
192 pkix_CRLSelector_RegisterSelf(plContext); | 184 pkix_PolicyNode_RegisterSelf(plContext); |
193 pkix_ComCRLSelParams_RegisterSelf(plContext); | 185 pkix_TargetCertCheckerState_RegisterSelf(plContext); |
194 pkix_pl_CertPolicyInfo_RegisterSelf(plContext); | 186 pkix_BasicConstraintsCheckerState_RegisterSelf(plContext); |
195 pkix_pl_CertPolicyQualifier_RegisterSelf(plContext); | 187 pkix_PolicyCheckerState_RegisterSelf(plContext); |
196 pkix_pl_CertPolicyMap_RegisterSelf(plContext); | 188 |
197 pkix_PolicyNode_RegisterSelf(plContext); | 189 pkix_pl_CollectionCertStoreContext_RegisterSelf(plContext); /* 41-50 */ |
198 pkix_TargetCertCheckerState_RegisterSelf(plContext); | 190 pkix_CrlChecker_RegisterSelf(plContext); |
199 pkix_BasicConstraintsCheckerState_RegisterSelf(plContext); | 191 pkix_ForwardBuilderState_RegisterSelf(plContext); |
200 pkix_PolicyCheckerState_RegisterSelf(plContext); | 192 pkix_SignatureCheckerState_RegisterSelf(plContext); |
201 | 193 pkix_NameConstraintsCheckerState_RegisterSelf(plContext); |
202 pkix_pl_CollectionCertStoreContext_RegisterSelf(plContext); /* 41-50 */ | |
203 pkix_CrlChecker_RegisterSelf(plContext); | |
204 pkix_ForwardBuilderState_RegisterSelf(plContext); | |
205 pkix_SignatureCheckerState_RegisterSelf(plContext); | |
206 pkix_NameConstraintsCheckerState_RegisterSelf(plContext); | |
207 #ifndef NSS_PKIX_NO_LDAP | 194 #ifndef NSS_PKIX_NO_LDAP |
208 pkix_pl_LdapRequest_RegisterSelf(plContext); | 195 pkix_pl_LdapRequest_RegisterSelf(plContext); |
209 pkix_pl_LdapResponse_RegisterSelf(plContext); | 196 pkix_pl_LdapResponse_RegisterSelf(plContext); |
210 pkix_pl_LdapDefaultClient_RegisterSelf(plContext); | 197 pkix_pl_LdapDefaultClient_RegisterSelf(plContext); |
211 #endif | 198 #endif |
212 pkix_pl_Socket_RegisterSelf(plContext); | 199 pkix_pl_Socket_RegisterSelf(plContext); |
213 | 200 |
214 pkix_ResourceLimits_RegisterSelf(plContext); /* 51-59 */ | 201 pkix_ResourceLimits_RegisterSelf(plContext); /* 51-59 */ |
215 pkix_pl_MonitorLock_RegisterSelf(plContext); | 202 pkix_pl_MonitorLock_RegisterSelf(plContext); |
216 pkix_pl_InfoAccess_RegisterSelf(plContext); | 203 pkix_pl_InfoAccess_RegisterSelf(plContext); |
217 pkix_pl_AIAMgr_RegisterSelf(plContext); | 204 pkix_pl_AIAMgr_RegisterSelf(plContext); |
218 pkix_OcspChecker_RegisterSelf(plContext); | 205 pkix_OcspChecker_RegisterSelf(plContext); |
219 pkix_pl_OcspCertID_RegisterSelf(plContext); | 206 pkix_pl_OcspCertID_RegisterSelf(plContext); |
220 pkix_pl_OcspRequest_RegisterSelf(plContext); | 207 pkix_pl_OcspRequest_RegisterSelf(plContext); |
221 pkix_pl_OcspResponse_RegisterSelf(plContext); | 208 pkix_pl_OcspResponse_RegisterSelf(plContext); |
222 pkix_pl_HttpDefaultClient_RegisterSelf(plContext); | 209 pkix_pl_HttpDefaultClient_RegisterSelf(plContext); |
223 pkix_VerifyNode_RegisterSelf(plContext); | 210 pkix_VerifyNode_RegisterSelf(plContext); |
224 pkix_EkuChecker_RegisterSelf(plContext); | 211 pkix_EkuChecker_RegisterSelf(plContext); |
225 pkix_pl_CrlDp_RegisterSelf(plContext); | 212 pkix_pl_CrlDp_RegisterSelf(plContext); |
226 | 213 |
227 if (pPlContext) { | 214 if (pPlContext) { |
228 PKIX_CHECK(PKIX_PL_NssContext_Create | 215 PKIX_CHECK(PKIX_PL_NssContext_Create(0, useArenas, NULL, &plContext), |
229 (0, useArenas, NULL, &plContext), | 216 PKIX_NSSCONTEXTCREATEFAILED); |
230 PKIX_NSSCONTEXTCREATEFAILED); | 217 |
231 ············ | 218 *pPlContext = plContext; |
232 *pPlContext = plContext; | 219 } |
233 } | 220 |
234 | 221 pkix_pl_initialized = PKIX_TRUE; |
235 pkix_pl_initialized = PKIX_TRUE; | |
236 | 222 |
237 cleanup: | 223 cleanup: |
238 | 224 |
239 PKIX_RETURN(OBJECT); | 225 PKIX_RETURN(OBJECT); |
240 } | 226 } |
241 | 227 |
242 /* | 228 /* |
243 * PKIX_PL_Shutdown (see comments in pkix_pl_system.h) | 229 * PKIX_PL_Shutdown (see comments in pkix_pl_system.h) |
244 */ | 230 */ |
245 PKIX_Error * | 231 PKIX_Error *PKIX_PL_Shutdown(void *plContext) { |
246 PKIX_PL_Shutdown(void *plContext) | 232 PKIX_UInt32 numLeakedObjects = 0; |
247 { | 233 |
248 PKIX_UInt32 numLeakedObjects = 0; | 234 PKIX_ENTER(OBJECT, "PKIX_PL_Shutdown"); |
249 | 235 |
250 PKIX_ENTER(OBJECT, "PKIX_PL_Shutdown"); | 236 if (!pkix_pl_initialized) { |
251 | 237 /* The library was not initilized */ |
252 if (!pkix_pl_initialized) { | 238 PKIX_RETURN(OBJECT); |
253 /* The library was not initilized */ | 239 } |
254 PKIX_RETURN(OBJECT); | 240 |
255 } | 241 PR_DestroyLock(classTableLock); |
256 | 242 |
257 PR_DestroyLock(classTableLock); | 243 pkix_pl_HttpCertStore_Shutdown(plContext); |
258 | 244 |
259 pkix_pl_HttpCertStore_Shutdown(plContext); | 245 numLeakedObjects = pkix_pl_lifecycle_ObjectLeakCheck(NULL); |
260 | 246 if (PR_GetEnv("NSS_STRICT_SHUTDOWN")) { |
261 numLeakedObjects = pkix_pl_lifecycle_ObjectLeakCheck(NULL); | 247 PORT_Assert(numLeakedObjects == 0); |
262 if (PR_GetEnv("NSS_STRICT_SHUTDOWN")) { | 248 } |
263 PORT_Assert(numLeakedObjects == 0); | 249 |
264 } | 250 if (plContext != NULL) { |
265 | 251 PKIX_PL_NssContext_Destroy(plContext); |
266 if (plContext != NULL) { | 252 } |
267 PKIX_PL_NssContext_Destroy(plContext); | 253 |
268 } | 254 pkix_pl_initialized = PKIX_FALSE; |
269 | 255 |
270 pkix_pl_initialized = PKIX_FALSE; | 256 PKIX_RETURN(OBJECT); |
271 | 257 } |
272 PKIX_RETURN(OBJECT); | |
273 } | |
OLD | NEW |