diff options
author | relyea%netscape.com <devnull@localhost> | 2002-10-10 22:39:23 +0000 |
---|---|---|
committer | relyea%netscape.com <devnull@localhost> | 2002-10-10 22:39:23 +0000 |
commit | 0975a4a9feff33b29f647796839e41f1cafcf70c (patch) | |
tree | ca0471a609c0f0cae0e41e1bfb39a69a3d31522a | |
parent | 8bba29c93437d1e847d1ef0a45c2a0a63043a015 (diff) | |
download | nss-hg-0975a4a9feff33b29f647796839e41f1cafcf70c.tar.gz |
Fix memory leaks in the startup of the builtins.
-rw-r--r-- | security/nss/lib/ckfw/instance.c | 8 | ||||
-rw-r--r-- | security/nss/lib/ckfw/slot.c | 3 | ||||
-rw-r--r-- | security/nss/lib/ckfw/token.c | 44 | ||||
-rw-r--r-- | security/nss/lib/ckfw/wrap.c | 3 |
4 files changed, 43 insertions, 15 deletions
diff --git a/security/nss/lib/ckfw/instance.c b/security/nss/lib/ckfw/instance.c index c2ced26fe..103726573 100644 --- a/security/nss/lib/ckfw/instance.c +++ b/security/nss/lib/ckfw/instance.c @@ -394,6 +394,14 @@ nssCKFWInstance_Destroy fwInstance->mdInstance->Finalize(fwInstance->mdInstance, fwInstance); } + if (fwInstance->sessionHandleHash) { + nssCKFWHash_Destroy(fwInstance->sessionHandleHash); + } + + if (fwInstance->objectHandleHash) { + nssCKFWHash_Destroy(fwInstance->objectHandleHash); + } + #ifdef DEBUG (void)instance_remove_pointer(fwInstance); #endif /* DEBUG */ diff --git a/security/nss/lib/ckfw/slot.c b/security/nss/lib/ckfw/slot.c index 4e2b0831c..4d3ae5761 100644 --- a/security/nss/lib/ckfw/slot.c +++ b/security/nss/lib/ckfw/slot.c @@ -256,6 +256,9 @@ nssCKFWSlot_Destroy return error; } #endif /* NSSDEBUG */ + if (fwSlot->fwToken) { + nssCKFWToken_Destroy(fwSlot->fwToken); + } (void)nssCKFWMutex_Destroy(fwSlot->mutex); diff --git a/security/nss/lib/ckfw/token.c b/security/nss/lib/ckfw/token.c index 6e4aa247b..f0e04eb3f 100644 --- a/security/nss/lib/ckfw/token.c +++ b/security/nss/lib/ckfw/token.c @@ -307,6 +307,22 @@ nssCKFWToken_Create return (NSSCKFWToken *)NULL; } +static void +nss_ckfwtoken_session_iterator +( + const void *key, + void *value, + void *closure +) +{ + /* + * Remember that the fwToken->mutex is locked + */ + NSSCKFWSession *fwSession = (NSSCKFWSession *)value; + (void)nssCKFWSession_Destroy(fwSession, CK_FALSE); + return; +} + /* * nssCKFWToken_Destroy * @@ -332,6 +348,19 @@ nssCKFWToken_Destroy fwToken->mdToken->Invalidate(fwToken->mdToken, fwToken, fwToken->mdInstance, fwToken->fwInstance); } + /* we can destroy the list without locking now because no one else is + * referencing us (or _Destroy was invalidly called!) + */ + nssCKFWHash_Iterate(fwToken->sessions, nss_ckfwtoken_session_iterator, + (void *)NULL); + nssCKFWHash_Destroy(fwToken->sessions); + + if (fwToken->sessionObjectHash) { + nssCKFWHash_Destroy(fwToken->sessionObjectHash); + } + if (fwToken->mdObjectHash) { + nssCKFWHash_Destroy(fwToken->mdObjectHash); + } nssCKFWSlot_ClearToken(fwToken->fwSlot); @@ -1547,21 +1576,6 @@ nssCKFWToken_RemoveSession return error; } -static void -nss_ckfwtoken_session_iterator -( - const void *key, - void *value, - void *closure -) -{ - /* - * Remember that the fwToken->mutex is locked - */ - NSSCKFWSession *fwSession = (NSSCKFWSession *)value; - (void)nssCKFWSession_Destroy(fwSession, CK_FALSE); - return; -} /* * nssCKFWToken_CloseAllSessions diff --git a/security/nss/lib/ckfw/wrap.c b/security/nss/lib/ckfw/wrap.c index 08ad62baf..5051a155d 100644 --- a/security/nss/lib/ckfw/wrap.c +++ b/security/nss/lib/ckfw/wrap.c @@ -209,6 +209,9 @@ NSSCKFWC_Finalize /* In any case */ *pFwInstance = (NSSCKFWInstance *)NULL; + /* clean up the arena pool records */ + PL_ArenaFinish(); + loser: switch( error ) { case CKR_CRYPTOKI_NOT_INITIALIZED: |