digcnt = (digestalgs == NULL) ? 0 : SecCmsArrayCount((void **)digestalgs);
- cmsdigcx = (SecCmsDigestContextRef)PORT_Alloc(sizeof(struct SecCmsDigestContextStr));
+ cmsdigcx = (SecCmsDigestContextRef)PORT_ZAlloc(sizeof(struct SecCmsDigestContextStr));
if (cmsdigcx == NULL)
return NULL;
if (digcnt >= (int)(INT_MAX/sizeof(CSSM_CC_HANDLE))) {
goto loser;
}
- cmsdigcx->digobjs = (CSSM_CC_HANDLE *)PORT_Alloc(digcnt * sizeof(CSSM_CC_HANDLE));
+ cmsdigcx->digobjs = (CSSM_CC_HANDLE *)PORT_ZAlloc(digcnt * sizeof(CSSM_CC_HANDLE));
if (cmsdigcx->digobjs == NULL)
goto loser;
}
loser:
if (cmsdigcx) {
- if (cmsdigcx->digobjs)
+ if (cmsdigcx->digobjs) {
PORT_Free(cmsdigcx->digobjs);
+ cmsdigcx->digobjs = NULL;
+ cmsdigcx->digcnt = 0;
+ }
}
return NULL;
}
dataBuf.Data = (uint8 *)data;
cmsdigcx->saw_contents = PR_TRUE;
for (i = 0; i < cmsdigcx->digcnt; i++)
- if (cmsdigcx->digobjs[i])
+ if (cmsdigcx->digobjs && cmsdigcx->digobjs[i])
CSSM_DigestDataUpdate(cmsdigcx->digobjs[i], &dataBuf, 1);
}
int i;
for (i = 0; i < cmsdigcx->digcnt; i++)
- if (cmsdigcx->digobjs[i])
+ if (cmsdigcx->digobjs && cmsdigcx->digobjs[i]) {
CSSM_DeleteContext(cmsdigcx->digobjs[i]);
+ cmsdigcx->digobjs[i] = 0;
+ }
}
/*
/* no contents? do not update digests */
if (digestsp == NULL || !cmsdigcx->saw_contents) {
for (i = 0; i < cmsdigcx->digcnt; i++)
- if (cmsdigcx->digobjs[i])
+ if (cmsdigcx->digobjs && cmsdigcx->digobjs[i]) {
CSSM_DeleteContext(cmsdigcx->digobjs[i]);
+ cmsdigcx->digobjs[i] = 0;
+ }
rv = SECSuccess;
- if (digestsp)
- *digestsp = NULL;
goto cleanup;
}
}
for (i = 0; i < cmsdigcx->digcnt; i++, digest++) {
- digobj = cmsdigcx->digobjs[i];
+ if (cmsdigcx->digobjs) {
+ digobj = cmsdigcx->digobjs[i];
+ } else {
+ digobj = 0;
+ }
+
CSSM_QUERY_SIZE_DATA dataSize;
rv = CSSM_QuerySize(digobj, CSSM_FALSE, 1, &dataSize);
if (rv != CSSM_OK)
}
CSSM_DeleteContext(digobj);
+ cmsdigcx->digobjs[i] = 0;
}
else
{
cleanup:
if (cmsdigcx->digcnt > 0) {
+ SecCmsDigestContextCancel(cmsdigcx);
PORT_Free(cmsdigcx->digobjs);
+ cmsdigcx->digobjs = NULL;
+ cmsdigcx->digcnt = 0;
}
PORT_Free(cmsdigcx);