cmsdigcx = PORT_New(NSSCMSDigestContext);
cmsdigcx = PORT_ArenaNew(pool, NSSCMSDigestContext);
NSS_CMSDigestContext_StartMultiple(SECAlgorithmID **digestalgs){    NSSCMSDigestContext *cmsdigcx;    int digcnt;    int i;#ifdef CMS_FIND_LEAK_MULTIPLE    PORT_Assert(num_digests == 0 || !stop_on_err);#endif    digcnt = (digestalgs == NULL) ? 0 : NSS_CMSArray_Count((void **)digestalgs);    cmsdigcx = PORT_New(NSSCMSDigestContext);    if (cmsdigcx == NULL)	return NULL;    if (digcnt > 0) {	cmsdigcx->digcxs  = PORT_NewArray(void *, digcnt);	cmsdigcx->digobjs = PORT_NewArray(const SECHashObject *, digcnt);	if (cmsdigcx->digcxs == NULL || cmsdigcx->digobjs == NULL)	    goto loser;    } else {	cmsdigcx->digcxs  = NULL;	cmsdigcx->digobjs = NULL;    }    cmsdigcx->digcnt = 0;    /*     * Create a digest object context for each algorithm.     */    for (i = 0; i < digcnt; i++) {	const SECHashObject *digobj;	void *digcx;	digobj = NSS_CMSUtil_GetHashObjByAlgID(digestalgs[i]);	/*	 * Skip any algorithm we do not even recognize; obviously,	 * this could be a problem, but if it is critical then the	 * result will just be that the signature does not verify.	 * We do not necessarily want to error out here, because	 * the particular algorithm may not actually be important,	 * but we cannot know that until later.	 */	if (digobj == NULL)	    continue;	digcx = (*digobj->create)();	if (digcx != NULL) {	    (*digobj->begin) (digcx);	    cmsdigcx->digobjs[cmsdigcx->digcnt] = digobj;	    cmsdigcx->digcxs[cmsdigcx->digcnt] = digcx;	    cmsdigcx->digcnt++;#ifdef CMS_FIND_LEAK_MULTIPLE	    num_digests++;#endif	}    }    cmsdigcx->saw_contents = PR_FALSE;    return cmsdigcx;loser:    if (cmsdigcx) {	if (cmsdigcx->digobjs)	    PORT_Free((void *)cmsdigcx->digobjs); /* cast away const */	if (cmsdigcx->digcxs)	    PORT_Free(cmsdigcx->digcxs);	PORT_Free(cmsdigcx);    }    return NULL;}