123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- /*
- * find.c
- *
- * This file implements the nssCKFWFindObjects type and methods.
- */
- #ifndef CK_H
- #include "ck.h"
- #endif /* CK_H */
- /*
- * NSSCKFWFindObjects
- *
- * -- create/destroy --
- * nssCKFWFindObjects_Create
- * nssCKFWFindObjects_Destroy
- *
- * -- public accessors --
- * NSSCKFWFindObjects_GetMDFindObjects
- *
- * -- implement public accessors --
- * nssCKFWFindObjects_GetMDFindObjects
- *
- * -- private accessors --
- *
- * -- module fronts --
- * nssCKFWFindObjects_Next
- */
- struct NSSCKFWFindObjectsStr {
- NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */
- NSSCKMDFindObjects *mdfo1;
- NSSCKMDFindObjects *mdfo2;
- NSSCKFWSession *fwSession;
- NSSCKMDSession *mdSession;
- NSSCKFWToken *fwToken;
- NSSCKMDToken *mdToken;
- NSSCKFWInstance *fwInstance;
- NSSCKMDInstance *mdInstance;
- NSSCKMDFindObjects *mdFindObjects; /* varies */
- };
- #ifdef DEBUG
- /*
- * But first, the pointer-tracking stuff.
- *
- * NOTE: the pointer-tracking support in NSS/base currently relies
- * upon NSPR's CallOnce support. That, however, relies upon NSPR's
- * locking, which is tied into the runtime. We need a pointer-tracker
- * implementation that uses the locks supplied through C_Initialize.
- * That support, however, can be filled in later. So for now, I'll
- * just do these routines as no-ops.
- */
- static CK_RV
- findObjects_add_pointer(
- const NSSCKFWFindObjects *fwFindObjects)
- {
- return CKR_OK;
- }
- static CK_RV
- findObjects_remove_pointer(
- const NSSCKFWFindObjects *fwFindObjects)
- {
- return CKR_OK;
- }
- NSS_IMPLEMENT CK_RV
- nssCKFWFindObjects_verifyPointer(
- const NSSCKFWFindObjects *fwFindObjects)
- {
- return CKR_OK;
- }
- #endif /* DEBUG */
- /*
- * nssCKFWFindObjects_Create
- *
- */
- NSS_EXTERN NSSCKFWFindObjects *
- nssCKFWFindObjects_Create(
- NSSCKFWSession *fwSession,
- NSSCKFWToken *fwToken,
- NSSCKFWInstance *fwInstance,
- NSSCKMDFindObjects *mdFindObjects1,
- NSSCKMDFindObjects *mdFindObjects2,
- CK_RV *pError)
- {
- NSSCKFWFindObjects *fwFindObjects = NULL;
- NSSCKMDSession *mdSession;
- NSSCKMDToken *mdToken;
- NSSCKMDInstance *mdInstance;
- mdSession = nssCKFWSession_GetMDSession(fwSession);
- mdToken = nssCKFWToken_GetMDToken(fwToken);
- mdInstance = nssCKFWInstance_GetMDInstance(fwInstance);
- fwFindObjects = nss_ZNEW(NULL, NSSCKFWFindObjects);
- if (!fwFindObjects) {
- *pError = CKR_HOST_MEMORY;
- goto loser;
- }
- fwFindObjects->mdfo1 = mdFindObjects1;
- fwFindObjects->mdfo2 = mdFindObjects2;
- fwFindObjects->fwSession = fwSession;
- fwFindObjects->mdSession = mdSession;
- fwFindObjects->fwToken = fwToken;
- fwFindObjects->mdToken = mdToken;
- fwFindObjects->fwInstance = fwInstance;
- fwFindObjects->mdInstance = mdInstance;
- fwFindObjects->mutex = nssCKFWInstance_CreateMutex(fwInstance, NULL, pError);
- if (!fwFindObjects->mutex) {
- goto loser;
- }
- #ifdef DEBUG
- *pError = findObjects_add_pointer(fwFindObjects);
- if (CKR_OK != *pError) {
- goto loser;
- }
- #endif /* DEBUG */
- return fwFindObjects;
- loser:
- if (fwFindObjects) {
- if (NULL != mdFindObjects1) {
- if (NULL != mdFindObjects1->Final) {
- fwFindObjects->mdFindObjects = mdFindObjects1;
- mdFindObjects1->Final(mdFindObjects1, fwFindObjects, mdSession,
- fwSession, mdToken, fwToken, mdInstance, fwInstance);
- }
- }
- if (NULL != mdFindObjects2) {
- if (NULL != mdFindObjects2->Final) {
- fwFindObjects->mdFindObjects = mdFindObjects2;
- mdFindObjects2->Final(mdFindObjects2, fwFindObjects, mdSession,
- fwSession, mdToken, fwToken, mdInstance, fwInstance);
- }
- }
- nss_ZFreeIf(fwFindObjects);
- }
- if (CKR_OK == *pError) {
- *pError = CKR_GENERAL_ERROR;
- }
- return (NSSCKFWFindObjects *)NULL;
- }
- /*
- * 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_GetMDFindObjects
- *
- */
- NSS_EXTERN NSSCKMDFindObjects *
- nssCKFWFindObjects_GetMDFindObjects(
- NSSCKFWFindObjects *fwFindObjects)
- {
- #ifdef NSSDEBUG
- if (CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects)) {
- return (NSSCKMDFindObjects *)NULL;
- }
- #endif /* NSSDEBUG */
- return fwFindObjects->mdFindObjects;
- }
- /*
- * 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;
- }
- /*
- * NSSCKFWFindObjects_GetMDFindObjects
- *
- */
- NSS_EXTERN NSSCKMDFindObjects *
- NSSCKFWFindObjects_GetMDFindObjects(
- NSSCKFWFindObjects *fwFindObjects)
- {
- #ifdef DEBUG
- if (CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects)) {
- return (NSSCKMDFindObjects *)NULL;
- }
- #endif /* DEBUG */
- return nssCKFWFindObjects_GetMDFindObjects(fwFindObjects);
- }
|