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