summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrelyea%netscape.com <devnull@localhost>2002-10-10 22:39:23 +0000
committerrelyea%netscape.com <devnull@localhost>2002-10-10 22:39:23 +0000
commit0975a4a9feff33b29f647796839e41f1cafcf70c (patch)
treeca0471a609c0f0cae0e41e1bfb39a69a3d31522a
parent8bba29c93437d1e847d1ef0a45c2a0a63043a015 (diff)
downloadnss-hg-0975a4a9feff33b29f647796839e41f1cafcf70c.tar.gz
Fix memory leaks in the startup of the builtins.
-rw-r--r--security/nss/lib/ckfw/instance.c8
-rw-r--r--security/nss/lib/ckfw/slot.c3
-rw-r--r--security/nss/lib/ckfw/token.c44
-rw-r--r--security/nss/lib/ckfw/wrap.c3
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: