diff options
author | roeber%netscape.com <devnull@localhost> | 2000-05-16 01:54:46 +0000 |
---|---|---|
committer | roeber%netscape.com <devnull@localhost> | 2000-05-16 01:54:46 +0000 |
commit | 8989b2ad574b932e7a47af0e289bbafbda32f102 (patch) | |
tree | 4a0f29985c708654ffbee6ce3e9ac80dfb7af747 /security/nss/lib/ckfw/session.c | |
parent | 6b9e59c07f1703acd6889fc8b43a418284afb385 (diff) | |
download | nss-hg-8989b2ad574b932e7a47af0e289bbafbda32f102.tar.gz |
Properly deregister shadow objects of session objects
Diffstat (limited to 'security/nss/lib/ckfw/session.c')
-rw-r--r-- | security/nss/lib/ckfw/session.c | 109 |
1 files changed, 108 insertions, 1 deletions
diff --git a/security/nss/lib/ckfw/session.c b/security/nss/lib/ckfw/session.c index d9e39f2ab..e12c74b8b 100644 --- a/security/nss/lib/ckfw/session.c +++ b/security/nss/lib/ckfw/session.c @@ -74,6 +74,8 @@ static const char CVS_ID[] = "@(#) $RCSfile$ $Revision$ $Date$ $Name$"; * nssCKFWSession_SetMDSession * nssCKFWSession_SetHandle * nssCKFWSession_GetHandle + * nssCKFWSession_RegisterSessionObject + * nssCKFWSession_DeegisterSessionObject * * -- module fronts -- * nssCKFWSession_GetDeviceError @@ -109,6 +111,7 @@ struct NSSCKFWSessionStr { CK_BBOOL rw; NSSCKFWFindObjects *fwFindObjects; + nssCKFWHash *sessionObjectHash; CK_SESSION_HANDLE hSession; }; @@ -209,6 +212,14 @@ nssCKFWSession_Create fwSession->fwFindObjects = (NSSCKFWFindObjects *)NULL; + fwSession->sessionObjectHash = nssCKFWHash_Create(fwSession->fwInstance, arena, pError); + if( (nssCKFWHash *)NULL == fwSession->sessionObjectHash ) { + if( CKR_OK == *pError ) { + *pError = CKR_GENERAL_ERROR; + } + goto loser; + } + #ifdef DEBUG *pError = session_add_pointer(fwSession); if( CKR_OK != *pError ) { @@ -220,12 +231,27 @@ nssCKFWSession_Create loser: if( (NSSArena *)NULL != arena ) { + if( (nssCKFWHash *)NULL != fwSession->sessionObjectHash ) { + (void)nssCKFWHash_Destroy(fwSession->sessionObjectHash); + } NSSArena_Destroy(arena); } return (NSSCKFWSession *)NULL; } +static void +nss_ckfw_session_object_destroy_iterator +( + const void *key, + void *value, + void *closure +) +{ + NSSCKFWObject *fwObject = (NSSCKFWObject *)value; + nssCKFWObject_Finalize(fwObject); +} + /* * nssCKFWSession_Destroy * @@ -238,6 +264,7 @@ nssCKFWSession_Destroy ) { CK_RV error = CKR_OK; + nssCKFWHash *sessionObjectHash; #ifdef NSSDEBUG error = nssCKFWSession_verifyPointer(fwSession); @@ -254,9 +281,17 @@ nssCKFWSession_Destroy * Invalidate session objects */ + sessionObjectHash = fwSession->sessionObjectHash; + fwSession->sessionObjectHash = (nssCKFWHash *)NULL; + + nssCKFWHash_Iterate(sessionObjectHash, + nss_ckfw_session_object_destroy_iterator, + (void *)NULL); + #ifdef DEBUG (void)session_remove_pointer(fwSession); #endif /* DEBUG */ + (void)nssCKFWHash_Destroy(sessionObjectHash); NSSArena_Destroy(fwSession->arena); return error; @@ -580,6 +615,56 @@ nssCKFWSession_GetHandle } /* + * nssCKFWSession_RegisterSessionObject + * + */ +NSS_IMPLEMENT CK_RV +nssCKFWSession_RegisterSessionObject +( + NSSCKFWSession *fwSession, + NSSCKFWObject *fwObject +) +{ + CK_RV rv = CKR_OK; + +#ifdef NSSDEBUG + if( CKR_OK != nssCKFWSession_verifyPointer(fwSession) ) { + return CKR_GENERAL_ERROR; + } +#endif /* NSSDEBUG */ + + if( (nssCKFWHash *)NULL != fwSession->sessionObjectHash ) { + rv = nssCKFWHash_Add(fwSession->sessionObjectHash, fwObject, fwObject); + } + + return rv; +} + +/* + * nssCKFWSession_DeregisterSessionObject + * + */ +NSS_IMPLEMENT CK_RV +nssCKFWSession_DeregisterSessionObject +( + NSSCKFWSession *fwSession, + NSSCKFWObject *fwObject +) +{ +#ifdef NSSDEBUG + if( CKR_OK != nssCKFWSession_verifyPointer(fwSession) ) { + return CKR_GENERAL_ERROR; + } +#endif /* NSSDEBUG */ + + if( (nssCKFWHash *)NULL != fwSession->sessionObjectHash ) { + nssCKFWHash_Remove(fwSession->sessionObjectHash, fwObject); + } + + return CKR_OK; +} + +/* * nssCKFWSession_GetDeviceError * */ @@ -1185,6 +1270,7 @@ nssCKFWSession_CreateObject NSSArena *arena; NSSCKMDObject *mdObject; NSSCKFWObject *fwObject; + CK_BBOOL isTokenObject; #ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { @@ -1211,7 +1297,8 @@ nssCKFWSession_CreateObject * Here would be an excellent place to sanity-check the object. */ - if( CK_TRUE == nss_attributes_form_token_object(pTemplate, ulAttributeCount) ) { + isTokenObject = nss_attributes_form_token_object(pTemplate, ulAttributeCount); + if( CK_TRUE == isTokenObject ) { /* === TOKEN OBJECT === */ if( (void *)NULL == (void *)fwSession->mdSession->CreateObject ) { @@ -1286,6 +1373,16 @@ nssCKFWSession_CreateObject return (NSSCKFWObject *)NULL; } + + if( CK_FALSE == isTokenObject ) { + if( CK_FALSE == nssCKFWHash_Exists(fwSession->sessionObjectHash, fwObject) ) { + *pError = nssCKFWHash_Add(fwSession->sessionObjectHash, fwObject, fwObject); + if( CKR_OK != *pError ) { + nssCKFWObject_Finalize(fwObject); + return (NSSCKFWObject *)NULL; + } + } + } return fwObject; } @@ -1400,6 +1497,16 @@ nssCKFWSession_CopyObject return (NSSCKFWObject *)NULL; } + if( CK_FALSE == newIsToken ) { + if( CK_FALSE == nssCKFWHash_Exists(fwSession->sessionObjectHash, rv) ) { + *pError = nssCKFWHash_Add(fwSession->sessionObjectHash, rv, rv); + if( CKR_OK != *pError ) { + nssCKFWObject_Finalize(rv); + return (NSSCKFWObject *)NULL; + } + } + } + return rv; } else { /* use create object */ |