NSS_EXTERN NSSCKMDFindObjects * NSSCKFWFindObjects_GetMDFindObjects( NSSCKFWFindObjects *fwFindObjects) { #ifdef DEBUG if (CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects)) { return (NSSCKMDFindObjects *)NULL; } #endif /* DEBUG */ return nssCKFWFindObjects_GetMDFindObjects(fwFindObjects); }
/* * nssCKFWFindObjects_Destroy * */ NSS_EXTERN void nssCKFWFindObjects_Destroy ( NSSCKFWFindObjects *fwFindObjects ) { #ifdef NSSDEBUG if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { return; } #endif /* NSSDEBUG */ (void)nssCKFWMutex_Destroy(fwFindObjects->mutex); if (fwFindObjects->mdfo1) { if (fwFindObjects->mdfo1->Final) { fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance); } } if (fwFindObjects->mdfo2) { if (fwFindObjects->mdfo2->Final) { fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance); } } nss_ZFreeIf(fwFindObjects); #ifdef DEBUG (void)findObjects_remove_pointer(fwFindObjects); #endif /* DEBUG */ return; }
/* * nssCKFWFindObjects_Next * */ NSS_EXTERN NSSCKFWObject * nssCKFWFindObjects_Next ( NSSCKFWFindObjects *fwFindObjects, NSSArena *arenaOpt, CK_RV *pError ) { NSSCKMDObject *mdObject; NSSCKFWObject *fwObject = (NSSCKFWObject *)NULL; NSSArena *objArena; #ifdef NSSDEBUG if (!pError) { return (NSSCKFWObject *)NULL; } *pError = nssCKFWFindObjects_verifyPointer(fwFindObjects); if( CKR_OK != *pError ) { return (NSSCKFWObject *)NULL; } #endif /* NSSDEBUG */ *pError = nssCKFWMutex_Lock(fwFindObjects->mutex); if( CKR_OK != *pError ) { return (NSSCKFWObject *)NULL; } if (fwFindObjects->mdfo1) { if (fwFindObjects->mdfo1->Next) { fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; mdObject = fwFindObjects->mdfo1->Next(fwFindObjects->mdfo1, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance, arenaOpt, pError); if (!mdObject) { if( CKR_OK != *pError ) { goto done; } /* All done. */ fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance); fwFindObjects->mdfo1 = (NSSCKMDFindObjects *)NULL; } else { goto wrap; } } } if (fwFindObjects->mdfo2) { if (fwFindObjects->mdfo2->Next) { fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; mdObject = fwFindObjects->mdfo2->Next(fwFindObjects->mdfo2, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance, arenaOpt, pError); if (!mdObject) { if( CKR_OK != *pError ) { goto done; } /* All done. */ fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, fwFindObjects->mdToken, fwFindObjects->fwToken, fwFindObjects->mdInstance, fwFindObjects->fwInstance); fwFindObjects->mdfo2 = (NSSCKMDFindObjects *)NULL; } else { goto wrap; } } } /* No more objects */ *pError = CKR_OK; goto done; wrap: /* * This seems is less than ideal-- we should determine if it's a token * object or a session object, and use the appropriate arena. * But that duplicates logic in nssCKFWObject_IsTokenObject. * Also we should lookup the real session the object was created on * if the object was a session object... however this code is actually * correct because nssCKFWObject_Create will return a cached version of * the object from it's hash. This is necessary because 1) we don't want * to create an arena style leak (where our arena grows with every search), * and 2) we want the same object to always have the same ID. This means * the only case the nssCKFWObject_Create() will need the objArena and the * Session is in the case of token objects (session objects should already * exist in the cache from their initial creation). So this code is correct, * but it depends on nssCKFWObject_Create caching all objects. */ objArena = nssCKFWToken_GetArena(fwFindObjects->fwToken, pError); if (!objArena) { if( CKR_OK == *pError ) { *pError = CKR_HOST_MEMORY; } goto done; } fwObject = nssCKFWObject_Create(objArena, mdObject, NULL, fwFindObjects->fwToken, fwFindObjects->fwInstance, pError); if (!fwObject) { if( CKR_OK == *pError ) { *pError = CKR_GENERAL_ERROR; } } done: (void)nssCKFWMutex_Unlock(fwFindObjects->mutex); return fwObject; }