diff options
author | nelson%bolyard.com <devnull@localhost> | 2008-09-30 04:09:04 +0000 |
---|---|---|
committer | nelson%bolyard.com <devnull@localhost> | 2008-09-30 04:09:04 +0000 |
commit | 0577fd47a1e0336a5cf72558a1613e602725cd36 (patch) | |
tree | 0c4f3e5b2f2fc4f87804e6b93086f43d44aa5162 | |
parent | 2c0ccc1946a59f39f9fd272cb67403637913c5da (diff) | |
download | nss-hg-0577fd47a1e0336a5cf72558a1613e602725cd36.tar.gz |
Stop assuming session pointers are non-NULL for bug 444974. r=rrelyea
-rw-r--r-- | security/nss/lib/dev/ckhelper.c | 19 | ||||
-rw-r--r-- | security/nss/lib/dev/devtoken.c | 75 | ||||
-rw-r--r-- | security/nss/lib/dev/devutil.c | 5 | ||||
-rw-r--r-- | security/nss/lib/pk11wrap/dev3hack.c | 9 | ||||
-rw-r--r-- | security/nss/lib/pk11wrap/pk11cert.c | 8 |
5 files changed, 90 insertions, 26 deletions
diff --git a/security/nss/lib/dev/ckhelper.c b/security/nss/lib/dev/ckhelper.c index ad1ab9459..499b114c9 100644 --- a/security/nss/lib/dev/ckhelper.c +++ b/security/nss/lib/dev/ckhelper.c @@ -359,6 +359,10 @@ nssCryptokiCertificate_GetAttributes ( session = sessionOpt ? sessionOpt : nssToken_GetDefaultSession(certObject->token); + if (!session) { + nss_SetError(NSS_ERROR_INVALID_ARGUMENT); + return PR_FAILURE; + } slot = nssToken_GetSlot(certObject->token); status = nssCKObject_GetAttributes(certObject->handle, @@ -457,6 +461,10 @@ nssCryptokiTrust_GetAttributes ( session = sessionOpt ? sessionOpt : nssToken_GetDefaultSession(trustObject->token); + if (!session) { + nss_SetError(NSS_ERROR_INVALID_ARGUMENT); + return PR_FAILURE; + } slot = nssToken_GetSlot(trustObject->token); status = nssCKObject_GetAttributes(trustObject->handle, @@ -522,6 +530,10 @@ nssCryptokiCRL_GetAttributes ( session = sessionOpt ? sessionOpt : nssToken_GetDefaultSession(crlObject->token); + if (session == NULL) { + nss_SetError(NSS_ERROR_INVALID_ARGUMENT); + return PR_FAILURE; + } slot = nssToken_GetSlot(crlObject->token); status = nssCKObject_GetAttributes(crlObject->handle, @@ -580,10 +592,9 @@ nssCryptokiPrivateKey_SetCertificate ( if (sessionOpt) { if (!nssSession_IsReadWrite(sessionOpt)) { return PR_FAILURE; - } else { - session = sessionOpt; - } - } else if (nssSession_IsReadWrite(defaultSession)) { + } + session = sessionOpt; + } else if (defaultSession && nssSession_IsReadWrite(defaultSession)) { session = defaultSession; } else { NSSSlot *slot = nssToken_GetSlot(token); diff --git a/security/nss/lib/dev/devtoken.c b/security/nss/lib/dev/devtoken.c index 7eb17b9d2..f93fca36b 100644 --- a/security/nss/lib/dev/devtoken.c +++ b/security/nss/lib/dev/devtoken.c @@ -182,7 +182,8 @@ nssToken_DeleteStoredObject ( nssTokenObjectCache_RemoveObject(token->cache, instance); } if (instance->isTokenObject) { - if (nssSession_IsReadWrite(token->defaultSession)) { + if (token->defaultSession && + nssSession_IsReadWrite(token->defaultSession)) { session = token->defaultSession; } else { session = nssSlot_CreateSession(token->slot, NULL, PR_TRUE); @@ -227,10 +228,10 @@ import_object ( if (!nssSession_IsReadWrite(sessionOpt)) { nss_SetError(NSS_ERROR_INVALID_ARGUMENT); return NULL; - } else { - session = sessionOpt; } - } else if (nssSession_IsReadWrite(tok->defaultSession)) { + session = sessionOpt; + } else if (tok->defaultSession && + nssSession_IsReadWrite(tok->defaultSession)) { session = tok->defaultSession; } else { session = nssSlot_CreateSession(tok->slot, NULL, PR_TRUE); @@ -307,8 +308,7 @@ find_objects ( nssSession *session = (sessionOpt) ? sessionOpt : tok->defaultSession; /* Don't ask the module to use an invalid session handle. */ - PORT_Assert(session->handle != CK_INVALID_SESSION); - if (session->handle == CK_INVALID_SESSION) { + if (!session || session->handle == CK_INVALID_SESSION) { ckrv = CKR_SESSION_HANDLE_INVALID; goto loser; } @@ -1147,7 +1147,13 @@ nssToken_FindTrustForCertificate ( CK_ATTRIBUTE tobj_template[5]; CK_ULONG tobj_size; nssSession *session = sessionOpt ? sessionOpt : token->defaultSession; - nssCryptokiObject *object, **objects; + nssCryptokiObject *object = NULL, **objects; + + /* Don't ask the module to use an invalid session handle. */ + if (!session || session->handle == CK_INVALID_SESSION) { + PORT_SetError(SEC_ERROR_NO_TOKEN); + return object; + } NSS_CK_TEMPLATE_START(tobj_template, attr, tobj_size); if (searchType == nssTokenSearchType_SessionOnly) { @@ -1159,7 +1165,6 @@ nssToken_FindTrustForCertificate ( NSS_CK_SET_ATTRIBUTE_ITEM(attr, CKA_ISSUER, certIssuer); NSS_CK_SET_ATTRIBUTE_ITEM(attr, CKA_SERIAL_NUMBER , certSerial); NSS_CK_TEMPLATE_FINISH(tobj_template, attr, tobj_size); - object = NULL; objects = find_objects_by_template(token, session, tobj_template, tobj_size, 1, NULL); @@ -1227,9 +1232,15 @@ nssToken_FindCRLsBySubject ( CK_ATTRIBUTE_PTR attr; CK_ATTRIBUTE crlobj_template[3]; CK_ULONG crlobj_size; - nssCryptokiObject **objects; + nssCryptokiObject **objects = NULL; nssSession *session = sessionOpt ? sessionOpt : token->defaultSession; + /* Don't ask the module to use an invalid session handle. */ + if (!session || session->handle == CK_INVALID_SESSION) { + PORT_SetError(SEC_ERROR_NO_TOKEN); + return objects; + } + NSS_CK_TEMPLATE_START(crlobj_template, attr, crlobj_size); if (searchType == nssTokenSearchType_SessionOnly) { NSS_CK_SET_ATTRIBUTE_ITEM(attr, CKA_TOKEN, &g_ck_false); @@ -1280,8 +1291,14 @@ nssToken_Digest ( CK_BYTE_PTR digest; NSSItem *rvItem = NULL; void *epv = nssToken_GetCryptokiEPV(tok); - nssSession *session; - session = (sessionOpt) ? sessionOpt : tok->defaultSession; + nssSession *session = (sessionOpt) ? sessionOpt : tok->defaultSession; + + /* Don't ask the module to use an invalid session handle. */ + if (!session || session->handle == CK_INVALID_SESSION) { + PORT_SetError(SEC_ERROR_NO_TOKEN); + return rvItem; + } + nssSession_EnterMonitor(session); ckrv = CKAPI(epv)->C_DigestInit(session->handle, &ap->mechanism); if (ckrv != CKR_OK) { @@ -1340,9 +1357,15 @@ nssToken_BeginDigest ( ) { CK_RV ckrv; - nssSession *session; void *epv = nssToken_GetCryptokiEPV(tok); - session = (sessionOpt) ? sessionOpt : tok->defaultSession; + nssSession *session = (sessionOpt) ? sessionOpt : tok->defaultSession; + + /* Don't ask the module to use an invalid session handle. */ + if (!session || session->handle == CK_INVALID_SESSION) { + PORT_SetError(SEC_ERROR_NO_TOKEN); + return PR_FAILURE; + } + nssSession_EnterMonitor(session); ckrv = CKAPI(epv)->C_DigestInit(session->handle, &ap->mechanism); nssSession_ExitMonitor(session); @@ -1357,9 +1380,15 @@ nssToken_ContinueDigest ( ) { CK_RV ckrv; - nssSession *session; void *epv = nssToken_GetCryptokiEPV(tok); - session = (sessionOpt) ? sessionOpt : tok->defaultSession; + nssSession *session = (sessionOpt) ? sessionOpt : tok->defaultSession; + + /* Don't ask the module to use an invalid session handle. */ + if (!session || session->handle == CK_INVALID_SESSION) { + PORT_SetError(SEC_ERROR_NO_TOKEN); + return PR_FAILURE; + } + nssSession_EnterMonitor(session); ckrv = CKAPI(epv)->C_DigestUpdate(session->handle, (CK_BYTE_PTR)item->data, @@ -1381,8 +1410,14 @@ nssToken_FinishDigest ( CK_BYTE_PTR digest; NSSItem *rvItem = NULL; void *epv = nssToken_GetCryptokiEPV(tok); - nssSession *session; - session = (sessionOpt) ? sessionOpt : tok->defaultSession; + nssSession *session = (sessionOpt) ? sessionOpt : tok->defaultSession; + + /* Don't ask the module to use an invalid session handle. */ + if (!session || session->handle == CK_INVALID_SESSION) { + PORT_SetError(SEC_ERROR_NO_TOKEN); + return NULL; + } + nssSession_EnterMonitor(session); ckrv = CKAPI(epv)->C_DigestFinal(session->handle, NULL, &digestLen); if (ckrv != CKR_OK || digestLen == 0) { @@ -1459,6 +1494,12 @@ nssToken_TraverseCertificates ( void *epv = nssToken_GetCryptokiEPV(token); nssSession *session = (sessionOpt) ? sessionOpt : token->defaultSession; + /* Don't ask the module to use an invalid session handle. */ + if (!session || session->handle == CK_INVALID_SESSION) { + PORT_SetError(SEC_ERROR_NO_TOKEN); + return PR_FAILURE; + } + /* template for all certs */ NSS_CK_TEMPLATE_START(cert_template, attr, ctsize); if (searchType == nssTokenSearchType_SessionOnly) { diff --git a/security/nss/lib/dev/devutil.c b/security/nss/lib/dev/devutil.c index b64febab6..eb7148aeb 100644 --- a/security/nss/lib/dev/devutil.c +++ b/security/nss/lib/dev/devutil.c @@ -387,7 +387,10 @@ create_object ( goto loser; } session = nssToken_GetDefaultSession(object->token); - + if (!session) { + nss_SetError(NSS_ERROR_INVALID_POINTER); + goto loser; + } arena = nssArena_Create(); if (!arena) { goto loser; diff --git a/security/nss/lib/pk11wrap/dev3hack.c b/security/nss/lib/pk11wrap/dev3hack.c index c7a586305..0d643f70c 100644 --- a/security/nss/lib/pk11wrap/dev3hack.c +++ b/security/nss/lib/pk11wrap/dev3hack.c @@ -195,7 +195,12 @@ nssToken_CreateFromPK11SlotInfo(NSSTrustDomain *td, PK11SlotInfo *nss3slot) nss3slot->session, nss3slot->sessionLock, nss3slot->defRWSession); - /* continue, even if rvToken->defaultSession is NULL */ +#if 0 /* we should do this instead of blindly continuing. */ + if (!rvToken->defaultSession) { + PORT_SetError(SEC_ERROR_NO_TOKEN); + goto loser; + } +#endif if (!PK11_IsInternal(nss3slot) && PK11_IsHW(nss3slot)) { rvToken->cache = nssTokenObjectCache_Create(rvToken, PR_TRUE, PR_TRUE, PR_TRUE); @@ -271,7 +276,7 @@ nssSlot_Refresh { PK11SlotInfo *nss3slot = slot->pk11slot; PRBool doit = PR_FALSE; - if (slot->token->base.name[0] == 0) { + if (slot->token && slot->token->base.name[0] == 0) { doit = PR_TRUE; } if (PK11_InitToken(nss3slot, PR_FALSE) != SECSuccess) { diff --git a/security/nss/lib/pk11wrap/pk11cert.c b/security/nss/lib/pk11wrap/pk11cert.c index bbafea5b3..0a81785b7 100644 --- a/security/nss/lib/pk11wrap/pk11cert.c +++ b/security/nss/lib/pk11wrap/pk11cert.c @@ -257,14 +257,18 @@ static CERTCertificate CK_ATTRIBUTE *privateLabel, char **nickptr) { NSSCertificate *c; - nssCryptokiObject *co; + nssCryptokiObject *co = NULL; nssPKIObject *pkio; NSSToken *token; NSSTrustDomain *td = STAN_GetDefaultTrustDomain(); /* Get the cryptoki object from the handle */ token = PK11Slot_GetNSSToken(slot); - co = nssCryptokiObject_Create(token, token->defaultSession, certID); + if (token->defaultSession) { + co = nssCryptokiObject_Create(token, token->defaultSession, certID); + } else { + PORT_SetError(SEC_ERROR_NO_TOKEN); + } if (!co) { return NULL; } |