original intent for concurrent list iteration, fixes bug 114727. a better long-term solution is needing for traversing the high-level token lists.

git-svn-id: svn://10.0.0.236/trunk@110318 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
ian.mcgreer%sun.com 2001-12-12 00:07:25 +00:00
parent 58d8228c46
commit eaa53f5d5a
2 changed files with 51 additions and 12 deletions

View File

@ -32,7 +32,7 @@
*/
#ifdef DEBUG
static const char CVS_ID[] = "@(#) $RCSfile: list.c,v $ $Revision: 1.9 $ $Date: 2001-11-29 19:34:00 $ $Name: not supported by cvs2svn $";
static const char CVS_ID[] = "@(#) $RCSfile: list.c,v $ $Revision: 1.10 $ $Date: 2001-12-12 00:07:22 $ $Name: not supported by cvs2svn $";
#endif /* DEBUG */
/*
@ -63,6 +63,7 @@ struct nssListStr {
};
struct nssListIteratorStr {
PZLock *lock;
nssList *list;
nssListElement *current;
};
@ -316,26 +317,56 @@ nssList_GetArray(nssList *list, void **rvArray, PRUint32 maxElements)
return PR_SUCCESS;
}
NSS_IMPLEMENT nssList *
nssList_Clone(nssList *list)
{
nssList *rvList;
nssListElement *node;
rvList = nssList_Create(list->arena, (list->lock != NULL));
if (!rvList) {
return NULL;
}
NSSLIST_LOCK_IF(list);
if (list->count > 0) {
node = list->head;
while (PR_TRUE) {
nssList_Add(rvList, node->data);
node = (nssListElement *)PR_NEXT_LINK(&node->link);
if (node == list->head) {
break;
}
}
}
NSSLIST_UNLOCK_IF(list);
return rvList;
}
NSS_IMPLEMENT nssListIterator *
nssList_CreateIterator(nssList *list)
{
nssListIterator *rvIterator;
rvIterator = nss_ZNEW(list->arena, nssListIterator);
rvIterator->list = list;
rvIterator->current = list->head;
rvIterator->list = nssList_Clone(list);
rvIterator->current = rvIterator->list->head;
if (list->lock) {
rvIterator->lock = PZ_NewLock(nssILockOther);
}
return rvIterator;
}
NSS_IMPLEMENT void
nssListIterator_Destroy(nssListIterator *iter)
{
if (iter->lock) {
(void)PZ_DestroyLock(iter->lock);
}
nss_ZFreeIf(iter);
}
NSS_IMPLEMENT void *
nssListIterator_Start(nssListIterator *iter)
{
NSSLIST_LOCK_IF(iter->list);
NSSLIST_LOCK_IF(iter);
if (iter->list->count == 0) {
return NULL;
}
@ -369,6 +400,6 @@ NSS_IMPLEMENT PRStatus
nssListIterator_Finish(nssListIterator *iter)
{
iter->current = iter->list->head;
return (iter->list->lock) ? PZ_Unlock(iter->list->lock) : PR_SUCCESS;
return (iter->lock) ? PZ_Unlock(iter->lock) : PR_SUCCESS;
}

View File

@ -32,7 +32,7 @@
*/
#ifdef DEBUG
static const char CVS_ID[] = "@(#) $RCSfile: pki3hack.c,v $ $Revision: 1.10 $ $Date: 2001-12-11 23:47:16 $ $Name: not supported by cvs2svn $";
static const char CVS_ID[] = "@(#) $RCSfile: pki3hack.c,v $ $Revision: 1.11 $ $Date: 2001-12-12 00:07:25 $ $Name: not supported by cvs2svn $";
#endif /* DEBUG */
/*
@ -392,9 +392,12 @@ nssTrust_GetCERTCertTrustForCert(NSSCertificate *c, CERTCertificate *cc)
NSSToken *tok;
NSSTrust *tokenTrust;
NSSTrust *t = NULL;
for (tok = (NSSToken *)nssListIterator_Start(td->tokens);
nssListIterator *tokens;
tokens = nssList_CreateIterator(td->tokenList);
if (!tokens) return NULL;
for (tok = (NSSToken *)nssListIterator_Start(tokens);
tok != (NSSToken *)NULL;
tok = (NSSToken *)nssListIterator_Next(td->tokens))
tok = (NSSToken *)nssListIterator_Next(tokens))
{
tokenTrust = nssToken_FindTrustForCert(tok, NULL, c,
nssTokenSearchType_AllObjects);
@ -419,7 +422,8 @@ nssTrust_GetCERTCertTrustForCert(NSSCertificate *c, CERTCertificate *cc)
}
}
}
nssListIterator_Finish(td->tokens);
nssListIterator_Finish(tokens);
nssListIterator_Destroy(tokens);
if (!t) {
return NULL;
}
@ -600,6 +604,7 @@ STAN_ChangeCertTrust(CERTCertificate *cc, CERTCertTrust *trust)
NSSToken *tok;
NSSTrustDomain *td;
NSSTrust nssTrust;
nssListIterator *tokens;
PRBool moving_object;
/* Set the CERTCertificate's trust */
cc->trust = trust;
@ -617,13 +622,16 @@ STAN_ChangeCertTrust(CERTCertificate *cc, CERTCertTrust *trust)
nssTrust.codeSigning = get_stan_trust(trust->objectSigningFlags, PR_FALSE);
td = STAN_GetDefaultTrustDomain();
if (PK11_IsReadOnly(cc->slot)) {
for (tok = (NSSToken *)nssListIterator_Start(td->tokens);
tokens = nssList_CreateIterator(td->tokenList);
if (!tokens) return PR_FAILURE;
for (tok = (NSSToken *)nssListIterator_Start(tokens);
tok != (NSSToken *)NULL;
tok = (NSSToken *)nssListIterator_Next(td->tokens))
tok = (NSSToken *)nssListIterator_Next(tokens))
{
if (!PK11_IsReadOnly(tok->pk11slot)) break;
}
nssListIterator_Finish(td->tokens);
nssListIterator_Finish(tokens);
nssListIterator_Destroy(tokens);
moving_object = PR_TRUE;
} else {
/* by default, store trust on same token as cert if writeable */