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 #ifdef DEBUG | |
6 static const char CVS_ID[] = "@(#) $RCSfile: find.c,v $ $Revision: 1.10 $ $Date:
2012/04/25 14:49:28 $"; | |
7 #endif /* DEBUG */ | |
8 | |
9 /* | |
10 * find.c | |
11 * | |
12 * This file implements the nssCKFWFindObjects type and methods. | |
13 */ | |
14 | |
15 #ifndef CK_H | |
16 #include "ck.h" | |
17 #endif /* CK_H */ | |
18 | |
19 /* | |
20 * NSSCKFWFindObjects | |
21 * | |
22 * -- create/destroy -- | |
23 * nssCKFWFindObjects_Create | |
24 * nssCKFWFindObjects_Destroy | |
25 * | |
26 * -- public accessors -- | |
27 * NSSCKFWFindObjects_GetMDFindObjects | |
28 * | |
29 * -- implement public accessors -- | |
30 * nssCKFWFindObjects_GetMDFindObjects | |
31 * | |
32 * -- private accessors -- | |
33 * | |
34 * -- module fronts -- | |
35 * nssCKFWFindObjects_Next | |
36 */ | |
37 | |
38 struct NSSCKFWFindObjectsStr { | |
39 NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */ | |
40 NSSCKMDFindObjects *mdfo1; | |
41 NSSCKMDFindObjects *mdfo2; | |
42 NSSCKFWSession *fwSession; | |
43 NSSCKMDSession *mdSession; | |
44 NSSCKFWToken *fwToken; | |
45 NSSCKMDToken *mdToken; | |
46 NSSCKFWInstance *fwInstance; | |
47 NSSCKMDInstance *mdInstance; | |
48 | |
49 NSSCKMDFindObjects *mdFindObjects; /* varies */ | |
50 }; | |
51 | |
52 #ifdef DEBUG | |
53 /* | |
54 * But first, the pointer-tracking stuff. | |
55 * | |
56 * NOTE: the pointer-tracking support in NSS/base currently relies | |
57 * upon NSPR's CallOnce support. That, however, relies upon NSPR's | |
58 * locking, which is tied into the runtime. We need a pointer-tracker | |
59 * implementation that uses the locks supplied through C_Initialize. | |
60 * That support, however, can be filled in later. So for now, I'll | |
61 * just do these routines as no-ops. | |
62 */ | |
63 | |
64 static CK_RV | |
65 findObjects_add_pointer | |
66 ( | |
67 const NSSCKFWFindObjects *fwFindObjects | |
68 ) | |
69 { | |
70 return CKR_OK; | |
71 } | |
72 | |
73 static CK_RV | |
74 findObjects_remove_pointer | |
75 ( | |
76 const NSSCKFWFindObjects *fwFindObjects | |
77 ) | |
78 { | |
79 return CKR_OK; | |
80 } | |
81 | |
82 NSS_IMPLEMENT CK_RV | |
83 nssCKFWFindObjects_verifyPointer | |
84 ( | |
85 const NSSCKFWFindObjects *fwFindObjects | |
86 ) | |
87 { | |
88 return CKR_OK; | |
89 } | |
90 | |
91 #endif /* DEBUG */ | |
92 | |
93 /* | |
94 * nssCKFWFindObjects_Create | |
95 * | |
96 */ | |
97 NSS_EXTERN NSSCKFWFindObjects * | |
98 nssCKFWFindObjects_Create | |
99 ( | |
100 NSSCKFWSession *fwSession, | |
101 NSSCKFWToken *fwToken, | |
102 NSSCKFWInstance *fwInstance, | |
103 NSSCKMDFindObjects *mdFindObjects1, | |
104 NSSCKMDFindObjects *mdFindObjects2, | |
105 CK_RV *pError | |
106 ) | |
107 { | |
108 NSSCKFWFindObjects *fwFindObjects = NULL; | |
109 NSSCKMDSession *mdSession; | |
110 NSSCKMDToken *mdToken; | |
111 NSSCKMDInstance *mdInstance; | |
112 | |
113 mdSession = nssCKFWSession_GetMDSession(fwSession); | |
114 mdToken = nssCKFWToken_GetMDToken(fwToken); | |
115 mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); | |
116 | |
117 fwFindObjects = nss_ZNEW(NULL, NSSCKFWFindObjects); | |
118 if (!fwFindObjects) { | |
119 *pError = CKR_HOST_MEMORY; | |
120 goto loser; | |
121 } | |
122 | |
123 fwFindObjects->mdfo1 = mdFindObjects1; | |
124 fwFindObjects->mdfo2 = mdFindObjects2; | |
125 fwFindObjects->fwSession = fwSession; | |
126 fwFindObjects->mdSession = mdSession; | |
127 fwFindObjects->fwToken = fwToken; | |
128 fwFindObjects->mdToken = mdToken; | |
129 fwFindObjects->fwInstance = fwInstance; | |
130 fwFindObjects->mdInstance = mdInstance; | |
131 | |
132 fwFindObjects->mutex = nssCKFWInstance_CreateMutex(fwInstance, NULL, pError); | |
133 if (!fwFindObjects->mutex) { | |
134 goto loser; | |
135 } | |
136 | |
137 #ifdef DEBUG | |
138 *pError = findObjects_add_pointer(fwFindObjects); | |
139 if( CKR_OK != *pError ) { | |
140 goto loser; | |
141 } | |
142 #endif /* DEBUG */ | |
143 | |
144 return fwFindObjects; | |
145 | |
146 loser: | |
147 if( fwFindObjects ) { | |
148 if( NULL != mdFindObjects1 ) { | |
149 if( NULL != mdFindObjects1->Final ) { | |
150 fwFindObjects->mdFindObjects = mdFindObjects1; | |
151 mdFindObjects1->Final(mdFindObjects1, fwFindObjects, mdSession, | |
152 fwSession, mdToken, fwToken, mdInstance, fwInstance); | |
153 } | |
154 } | |
155 | |
156 if( NULL != mdFindObjects2 ) { | |
157 if( NULL != mdFindObjects2->Final ) { | |
158 fwFindObjects->mdFindObjects = mdFindObjects2; | |
159 mdFindObjects2->Final(mdFindObjects2, fwFindObjects, mdSession, | |
160 fwSession, mdToken, fwToken, mdInstance, fwInstance); | |
161 } | |
162 } | |
163 | |
164 nss_ZFreeIf(fwFindObjects); | |
165 } | |
166 | |
167 if( CKR_OK == *pError ) { | |
168 *pError = CKR_GENERAL_ERROR; | |
169 } | |
170 | |
171 return (NSSCKFWFindObjects *)NULL; | |
172 } | |
173 | |
174 | |
175 /* | |
176 * nssCKFWFindObjects_Destroy | |
177 * | |
178 */ | |
179 NSS_EXTERN void | |
180 nssCKFWFindObjects_Destroy | |
181 ( | |
182 NSSCKFWFindObjects *fwFindObjects | |
183 ) | |
184 { | |
185 #ifdef NSSDEBUG | |
186 if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { | |
187 return; | |
188 } | |
189 #endif /* NSSDEBUG */ | |
190 | |
191 (void)nssCKFWMutex_Destroy(fwFindObjects->mutex); | |
192 | |
193 if (fwFindObjects->mdfo1) { | |
194 if (fwFindObjects->mdfo1->Final) { | |
195 fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; | |
196 fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, | |
197 fwFindObjects->mdSession, fwFindObjects->fwSession, | |
198 fwFindObjects->mdToken, fwFindObjects->fwToken, | |
199 fwFindObjects->mdInstance, fwFindObjects->fwInstance); | |
200 } | |
201 } | |
202 | |
203 if (fwFindObjects->mdfo2) { | |
204 if (fwFindObjects->mdfo2->Final) { | |
205 fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; | |
206 fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, | |
207 fwFindObjects->mdSession, fwFindObjects->fwSession, | |
208 fwFindObjects->mdToken, fwFindObjects->fwToken, | |
209 fwFindObjects->mdInstance, fwFindObjects->fwInstance); | |
210 } | |
211 } | |
212 | |
213 nss_ZFreeIf(fwFindObjects); | |
214 | |
215 #ifdef DEBUG | |
216 (void)findObjects_remove_pointer(fwFindObjects); | |
217 #endif /* DEBUG */ | |
218 | |
219 return; | |
220 } | |
221 | |
222 /* | |
223 * nssCKFWFindObjects_GetMDFindObjects | |
224 * | |
225 */ | |
226 NSS_EXTERN NSSCKMDFindObjects * | |
227 nssCKFWFindObjects_GetMDFindObjects | |
228 ( | |
229 NSSCKFWFindObjects *fwFindObjects | |
230 ) | |
231 { | |
232 #ifdef NSSDEBUG | |
233 if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { | |
234 return (NSSCKMDFindObjects *)NULL; | |
235 } | |
236 #endif /* NSSDEBUG */ | |
237 | |
238 return fwFindObjects->mdFindObjects; | |
239 } | |
240 | |
241 /* | |
242 * nssCKFWFindObjects_Next | |
243 * | |
244 */ | |
245 NSS_EXTERN NSSCKFWObject * | |
246 nssCKFWFindObjects_Next | |
247 ( | |
248 NSSCKFWFindObjects *fwFindObjects, | |
249 NSSArena *arenaOpt, | |
250 CK_RV *pError | |
251 ) | |
252 { | |
253 NSSCKMDObject *mdObject; | |
254 NSSCKFWObject *fwObject = (NSSCKFWObject *)NULL; | |
255 NSSArena *objArena; | |
256 | |
257 #ifdef NSSDEBUG | |
258 if (!pError) { | |
259 return (NSSCKFWObject *)NULL; | |
260 } | |
261 | |
262 *pError = nssCKFWFindObjects_verifyPointer(fwFindObjects); | |
263 if( CKR_OK != *pError ) { | |
264 return (NSSCKFWObject *)NULL; | |
265 } | |
266 #endif /* NSSDEBUG */ | |
267 | |
268 *pError = nssCKFWMutex_Lock(fwFindObjects->mutex); | |
269 if( CKR_OK != *pError ) { | |
270 return (NSSCKFWObject *)NULL; | |
271 } | |
272 | |
273 if (fwFindObjects->mdfo1) { | |
274 if (fwFindObjects->mdfo1->Next) { | |
275 fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; | |
276 mdObject = fwFindObjects->mdfo1->Next(fwFindObjects->mdfo1, | |
277 fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, | |
278 fwFindObjects->mdToken, fwFindObjects->fwToken, | |
279 fwFindObjects->mdInstance, fwFindObjects->fwInstance, | |
280 arenaOpt, pError); | |
281 if (!mdObject) { | |
282 if( CKR_OK != *pError ) { | |
283 goto done; | |
284 } | |
285 | |
286 /* All done. */ | |
287 fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, | |
288 fwFindObjects->mdSession, fwFindObjects->fwSession, | |
289 fwFindObjects->mdToken, fwFindObjects->fwToken, | |
290 fwFindObjects->mdInstance, fwFindObjects->fwInstance); | |
291 fwFindObjects->mdfo1 = (NSSCKMDFindObjects *)NULL; | |
292 } else { | |
293 goto wrap; | |
294 } | |
295 } | |
296 } | |
297 | |
298 if (fwFindObjects->mdfo2) { | |
299 if (fwFindObjects->mdfo2->Next) { | |
300 fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; | |
301 mdObject = fwFindObjects->mdfo2->Next(fwFindObjects->mdfo2, | |
302 fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, | |
303 fwFindObjects->mdToken, fwFindObjects->fwToken, | |
304 fwFindObjects->mdInstance, fwFindObjects->fwInstance, | |
305 arenaOpt, pError); | |
306 if (!mdObject) { | |
307 if( CKR_OK != *pError ) { | |
308 goto done; | |
309 } | |
310 | |
311 /* All done. */ | |
312 fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, | |
313 fwFindObjects->mdSession, fwFindObjects->fwSession, | |
314 fwFindObjects->mdToken, fwFindObjects->fwToken, | |
315 fwFindObjects->mdInstance, fwFindObjects->fwInstance); | |
316 fwFindObjects->mdfo2 = (NSSCKMDFindObjects *)NULL; | |
317 } else { | |
318 goto wrap; | |
319 } | |
320 } | |
321 } | |
322 | |
323 /* No more objects */ | |
324 *pError = CKR_OK; | |
325 goto done; | |
326 | |
327 wrap: | |
328 /* | |
329 * This seems is less than ideal-- we should determine if it's a token | |
330 * object or a session object, and use the appropriate arena. | |
331 * But that duplicates logic in nssCKFWObject_IsTokenObject. | |
332 * Also we should lookup the real session the object was created on | |
333 * if the object was a session object... however this code is actually | |
334 * correct because nssCKFWObject_Create will return a cached version of | |
335 * the object from it's hash. This is necessary because 1) we don't want | |
336 * to create an arena style leak (where our arena grows with every search), | |
337 * and 2) we want the same object to always have the same ID. This means | |
338 * the only case the nssCKFWObject_Create() will need the objArena and the | |
339 * Session is in the case of token objects (session objects should already | |
340 * exist in the cache from their initial creation). So this code is correct, | |
341 * but it depends on nssCKFWObject_Create caching all objects. | |
342 */ | |
343 objArena = nssCKFWToken_GetArena(fwFindObjects->fwToken, pError); | |
344 if (!objArena) { | |
345 if( CKR_OK == *pError ) { | |
346 *pError = CKR_HOST_MEMORY; | |
347 } | |
348 goto done; | |
349 } | |
350 | |
351 fwObject = nssCKFWObject_Create(objArena, mdObject, | |
352 NULL, fwFindObjects->fwToken, | |
353 fwFindObjects->fwInstance, pError); | |
354 if (!fwObject) { | |
355 if( CKR_OK == *pError ) { | |
356 *pError = CKR_GENERAL_ERROR; | |
357 } | |
358 } | |
359 | |
360 done: | |
361 (void)nssCKFWMutex_Unlock(fwFindObjects->mutex); | |
362 return fwObject; | |
363 } | |
364 | |
365 /* | |
366 * NSSCKFWFindObjects_GetMDFindObjects | |
367 * | |
368 */ | |
369 | |
370 NSS_EXTERN NSSCKMDFindObjects * | |
371 NSSCKFWFindObjects_GetMDFindObjects | |
372 ( | |
373 NSSCKFWFindObjects *fwFindObjects | |
374 ) | |
375 { | |
376 #ifdef DEBUG | |
377 if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { | |
378 return (NSSCKMDFindObjects *)NULL; | |
379 } | |
380 #endif /* DEBUG */ | |
381 | |
382 return nssCKFWFindObjects_GetMDFindObjects(fwFindObjects); | |
383 } | |
OLD | NEW |