NSS_IMPLEMENT NSSCertificate * nssCertificate_AddRef ( NSSCertificate *c ) { if (c) { nssPKIObject_AddRef(&c->object); } return c; }
NSS_IMPLEMENT nssSMIMEProfile * nssSMIMEProfile_AddRef ( nssSMIMEProfile *profile ) { if (profile) { nssPKIObject_AddRef(&profile->object); } return profile; }
NSS_IMPLEMENT NSSCRL * nssCRL_AddRef ( NSSCRL *crl ) { if (crl) { nssPKIObject_AddRef(&crl->object); } return crl; }
NSS_IMPLEMENT NSSTrust * nssTrust_AddRef ( NSSTrust *trust ) { if (trust) { nssPKIObject_AddRef(&trust->object); } return trust; }
/* ** Delete trust objects matching the given slot. ** Returns error if a device fails to delete. ** ** This function has the side effect of moving the ** surviving entries to the front of the object list ** and nullifying the rest. */ static PRStatus DeleteCertTrustMatchingSlot(PK11SlotInfo *pk11slot, nssPKIObject *tObject) { int numNotDestroyed = 0; /* the ones skipped plus the failures */ int failureCount = 0; /* actual deletion failures by devices */ unsigned int index; nssPKIObject_AddRef(tObject); nssPKIObject_Lock(tObject); /* Keep going even if a module fails to delete. */ for (index = 0; index < tObject->numInstances; index++) { nssCryptokiObject *instance = tObject->instances[index]; if (!instance) { continue; } /* ReadOnly and not matched treated the same */ if (PK11_IsReadOnly(instance->token->pk11slot) || pk11slot != instance->token->pk11slot) { tObject->instances[numNotDestroyed++] = instance; continue; } /* Here we have found a matching one */ tObject->instances[index] = NULL; if (nssToken_DeleteStoredObject(instance) == PR_SUCCESS) { nssCryptokiObject_Destroy(instance); } else { tObject->instances[numNotDestroyed++] = instance; failureCount++; } } if (numNotDestroyed == 0) { nss_ZFreeIf(tObject->instances); tObject->numInstances = 0; } else { tObject->numInstances = numNotDestroyed; } nssPKIObject_Unlock(tObject); nssPKIObject_Destroy(tObject); return failureCount == 0 ? PR_SUCCESS : PR_FAILURE; }
/* ** Delete trust objects matching the slot of the given certificate. ** Returns an error if any device fails to delete. */ NSS_EXTERN PRStatus STAN_DeleteCertTrustMatchingSlot(NSSCertificate *c) { PRStatus nssrv = PR_SUCCESS; unsigned int i; nssPKIObject *tobject = NULL; nssPKIObject *cobject = &c->object; NSSTrustDomain *td = STAN_GetDefaultTrustDomain(); NSSTrust *nssTrust = nssTrustDomain_FindTrustForCertificate(td, c); if (!nssTrust) { return PR_FAILURE; } tobject = &nssTrust->object; /* Iterate through the cert and trust object instances looking for * those with matching pk11 slots to delete. Even if some device * can't delete we keep going. Keeping a status variable for the * loop so that once it's failed the other gets set. */ NSSRWLock_LockRead(td->tokensLock); nssPKIObject_AddRef(cobject); nssPKIObject_Lock(cobject); for (i = 0; i < cobject->numInstances; i++) { nssCryptokiObject *cInstance = cobject->instances[i]; if (cInstance && !PK11_IsReadOnly(cInstance->token->pk11slot)) { PRStatus status; if (!tobject->numInstances || !tobject->instances) continue; status = DeleteCertTrustMatchingSlot(cInstance->token->pk11slot, tobject); if (status == PR_FAILURE) { /* set the outer one but keep going */ nssrv = PR_FAILURE; } } } nssTrust_Destroy(nssTrust); nssPKIObject_Unlock(cobject); nssPKIObject_Destroy(cobject); NSSRWLock_UnlockRead(td->tokensLock); return nssrv; }
static void remove_token_certs(NSSCertificate *c, struct token_cert_dtor *dtor) { nssPKIObject *object = &c->object; PRUint32 i; nssPKIObject_AddRef(object); nssPKIObject_Lock(object); for (i = 0; i < object->numInstances; i++) { if (object->instances[i]->token == dtor->token) { nssCryptokiObject_Destroy(object->instances[i]); object->instances[i] = object->instances[object->numInstances - 1]; object->instances[object->numInstances - 1] = NULL; object->numInstances--; dtor->certs[dtor->numCerts++] = c; if (dtor->numCerts == dtor->arrSize) { dtor->arrSize *= 2; dtor->certs = nss_ZREALLOCARRAY(dtor->certs, NSSCertificate *, dtor->arrSize); } break; }
static CERTCertificate * stan_GetCERTCertificate(NSSCertificate *c, PRBool forceUpdate) { nssDecodedCert *dc = NULL; CERTCertificate *cc = NULL; CERTCertTrust certTrust; /* make sure object does not go away until we finish */ nssPKIObject_AddRef(&c->object); nssPKIObject_Lock(&c->object); dc = c->decoding; if (!dc) { dc = nssDecodedPKIXCertificate_Create(NULL, &c->encoding); if (!dc) { goto loser; } cc = (CERTCertificate *)dc->data; PORT_Assert(cc); /* software error */ if (!cc) { nssDecodedPKIXCertificate_Destroy(dc); nss_SetError(NSS_ERROR_INTERNAL_ERROR); goto loser; } PORT_Assert(!c->decoding); if (!c->decoding) { c->decoding = dc; } else { /* this should never happen. Fail. */ nssDecodedPKIXCertificate_Destroy(dc); nss_SetError(NSS_ERROR_INTERNAL_ERROR); goto loser; } } cc = (CERTCertificate *)dc->data; PORT_Assert(cc); if (!cc) { nss_SetError(NSS_ERROR_INTERNAL_ERROR); goto loser; } if (!cc->nssCertificate || forceUpdate) { fill_CERTCertificateFields(c, cc, forceUpdate); } else if (CERT_GetCertTrust(cc, &certTrust) != SECSuccess && !c->object.cryptoContext) { /* if it's a perm cert, it might have been stored before the * trust, so look for the trust again. But a temp cert can be * ignored. */ CERTCertTrust* trust = NULL; trust = nssTrust_GetCERTCertTrustForCert(c, cc); CERT_LockCertTrust(cc); cc->trust = trust; CERT_UnlockCertTrust(cc); } loser: nssPKIObject_Unlock(&c->object); nssPKIObject_Destroy(&c->object); return cc; }