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