CERTDistNames * CERT_DistNamesFromCertList(CERTCertList *certList) { CERTDistNames *dnames = NULL; PLArenaPool *arena; CERTCertListNode *node = NULL; SECItem *names = NULL; int listLen = 0, i = 0; if (certList == NULL) { PORT_SetError(SEC_ERROR_INVALID_ARGS); return NULL; } node = CERT_LIST_HEAD(certList); while (!CERT_LIST_END(node, certList)) { listLen += 1; node = CERT_LIST_NEXT(node); } arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); if (arena == NULL) goto loser; dnames = PORT_ArenaZNew(arena, CERTDistNames); if (dnames == NULL) goto loser; dnames->arena = arena; dnames->nnames = listLen; dnames->names = names = PORT_ArenaZNewArray(arena, SECItem, listLen); if (names == NULL) goto loser; node = CERT_LIST_HEAD(certList); while (!CERT_LIST_END(node, certList)) { CERTCertificate *cert = node->cert; SECStatus rv = SECITEM_CopyItem(arena, &names[i++], &cert->derSubject); if (rv == SECFailure) { goto loser; } node = CERT_LIST_NEXT(node); } return dnames; loser: if (arena) { PORT_FreeArena(arena, PR_FALSE); } return NULL; }
CERTDistNames * CERT_DistNamesFromNicknames(CERTCertDBHandle *handle, char **nicknames, int nnames) { CERTDistNames *dnames = NULL; PLArenaPool *arena; int i, rv; SECItem *names = NULL; CERTCertificate *cert = NULL; arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); if (arena == NULL) goto loser; dnames = PORT_ArenaZNew(arena, CERTDistNames); if (dnames == NULL) goto loser; dnames->arena = arena; dnames->nnames = nnames; dnames->names = names = PORT_ArenaZNewArray(arena, SECItem, nnames); if (names == NULL) goto loser; for (i = 0; i < nnames; i++) { cert = CERT_FindCertByNicknameOrEmailAddr(handle, nicknames[i]); if (cert == NULL) goto loser; rv = SECITEM_CopyItem(arena, &names[i], &cert->derSubject); if (rv == SECFailure) goto loser; CERT_DestroyCertificate(cert); } return dnames; loser: if (cert != NULL) CERT_DestroyCertificate(cert); if (arena != NULL) PORT_FreeArena(arena, PR_FALSE); return NULL; }
SECItemArray * SECITEM_AllocArray(PLArenaPool *arena, SECItemArray *array, unsigned int len) { SECItemArray *result = NULL; void *mark = NULL; if (array != NULL && array->items != NULL) { PORT_Assert(0); PORT_SetError(SEC_ERROR_INVALID_ARGS); return NULL; } if (arena != NULL) { mark = PORT_ArenaMark(arena); } if (array == NULL) { if (arena != NULL) { result = PORT_ArenaZAlloc(arena, sizeof(SECItemArray)); } else { result = PORT_ZAlloc(sizeof(SECItemArray)); } if (result == NULL) { goto loser; } } else { result = array; } result->len = len; if (len) { if (arena != NULL) { result->items = PORT_ArenaZNewArray(arena, SECItem, len); } else { result->items = PORT_ZNewArray(SECItem, len); } if (result->items == NULL) { goto loser; } } else { result->items = NULL; } if (mark) { PORT_ArenaUnmark(arena, mark); } return result; loser: if ( arena != NULL ) { if (mark) { PORT_ArenaRelease(arena, mark); } } else { if (result != NULL && array == NULL) { PORT_Free(result); } } if (array != NULL) { array->items = NULL; array->len = 0; } return NULL; }
SECItemArray * SECITEM_AllocArray(PLArenaPool *arena, SECItemArray *array, unsigned int len) { SECItemArray *result = NULL; void *mark = NULL; if (arena != NULL) { mark = PORT_ArenaMark(arena); } if (array == NULL) { if (arena != NULL) { result = PORT_ArenaZAlloc(arena, sizeof(SECItemArray)); } else { result = PORT_ZAlloc(sizeof(SECItemArray)); } if (result == NULL) { goto loser; } } else { PORT_Assert(array->items == NULL); result = array; } result->len = len; if (len) { if (arena != NULL) { result->items = PORT_ArenaZNewArray(arena, SECItem, len); } else { result->items = PORT_ZNewArray(SECItem, len); } if (result->items == NULL) { goto loser; } } else { result->items = NULL; } if (mark) { PORT_ArenaUnmark(arena, mark); } return(result); loser: if ( arena != NULL ) { if (mark) { PORT_ArenaRelease(arena, mark); } if (array != NULL) { array->items = NULL; array->len = 0; } } else { if (result != NULL && array == NULL) { PORT_Free(result); } /* * If array is not NULL, the above has set array->data and * array->len to 0. */ } return(NULL); }