| 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 |