find.c (11188B)
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, fwInstance); 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, fwInstance); 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->fwToken, 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->fwToken, 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, fwFindObjects->fwToken, 260 fwFindObjects->mdInstance, fwFindObjects->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, fwFindObjects->fwSession, 270 fwFindObjects->mdToken, fwFindObjects->fwToken, 271 fwFindObjects->mdInstance, fwFindObjects->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, fwFindObjects->fwToken, 285 fwFindObjects->mdInstance, fwFindObjects->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, fwFindObjects->fwSession, 295 fwFindObjects->mdToken, fwFindObjects->fwToken, 296 fwFindObjects->mdInstance, fwFindObjects->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 }