SecCmsEncoderRef p7ecx;
SecCmsContentInfoRef rootcinfo, cinfo;
Boolean after = !before;
- PLArenaPool *poolp;
SECOidTag childtype;
CSSM_DATA_PTR item;
PORT_Assert(p7ecx != NULL);
rootcinfo = &(p7ecx->cmsg->contentInfo);
- poolp = p7ecx->cmsg->poolp;
#ifdef CMSDEBUG
fprintf(stderr, "%6.6s, dest = %p, depth = %d\n", before ? "before" : "after", dest, depth);
/* we're right before encoding the data (if we have some or not) */
/* (for encrypted data, we're right before the contentEncAlg which may change */
/* in nss_cms_before_data because of IV calculation when setting up encryption) */
- if (nss_cms_before_data(p7ecx) != SECSuccess)
- p7ecx->error = PORT_GetError();
+ if (nss_cms_before_data(p7ecx) != SECSuccess) {
+ p7ecx->error = PORT_GetError();
+ PORT_SetError(0); // Clean the thread error since we've returned the error
+ }
}
if (before && dest == &(cinfo->rawContent)) {
if ( ((childtype == SEC_OID_PKCS7_DATA) || (childtype == SEC_OID_OTHER)) &&
SEC_ASN1EncoderSetTakeFromBuf(p7ecx->ecx);
}
if (after && dest == &(cinfo->rawContent)) {
- if (nss_cms_after_data(p7ecx) != SECSuccess)
- p7ecx->error = PORT_GetError();
+ if (nss_cms_after_data(p7ecx) != SECSuccess) {
+ p7ecx->error = PORT_GetError();
+ PORT_SetError(0); // Clean the thread error since we've returned the error
+ }
SEC_ASN1EncoderClearNotifyProc(p7ecx->ecx); /* no need to get notified anymore */
}
break;
OSStatus rv;
SECOidTag childtype;
SecCmsContentInfoRef cinfo;
- PLArenaPool *poolp;
SecCmsEncoderRef childp7ecx;
const SecAsn1Template *template;
- poolp = p7ecx->cmsg->poolp;
-
/* call _Encode_BeforeData handlers */
switch (p7ecx->type) {
case SEC_OID_PKCS7_SIGNED_DATA:
OSStatus result;
SecCmsContentInfoRef cinfo;
+ /* Clear the thread error to clean up dirty threads */
+ PORT_SetError(0);
+
SecCmsMessageSetEncodingParams(cmsg, pwfn, pwfn_arg, decrypt_key_cb, decrypt_key_cb_arg,
detached_digestalgs, detached_digests);
result = paramErr;
break;
}
- if (result)
+
+ if (result) {
+ PORT_Free(p7ecx);
goto loser;
+ }
/* Initialize the BER encoder.
* Note that this will not encode anything until the first call to SEC_ASN1EncoderUpdate */
nss_cms_encoder_out, &(p7ecx->output));
if (p7ecx->ecx == NULL) {
result = PORT_GetError();
- PORT_Free (p7ecx);
+ PORT_Free(p7ecx);
+ PORT_SetError(0); // Clean the thread error since we've returned the error
goto loser;
}
p7ecx->ecxupdated = PR_FALSE;
* a child encoder). */
if (SEC_ASN1EncoderUpdate(p7ecx->ecx, NULL, 0) != SECSuccess) {
result = PORT_GetError();
- PORT_Free (p7ecx);
+ PORT_Free(p7ecx);
+ PORT_SetError(0); // Clean the thread error since we've returned the error
goto loser;
}
SecCmsContentInfoRef cinfo;
SECOidTag childtype;
+ if (!p7ecx) {
+ return errSecParam;
+ }
+
if (p7ecx->error)
return p7ecx->error;
/* hand it the data so it can encode it (let DER trickle up the chain) */
result = nss_cms_encoder_work_data(p7ecx, NULL, (const unsigned char *)data, len, PR_FALSE, PR_TRUE);
- if (result)
+ if (result) {
result = PORT_GetError();
+ PORT_SetError(0); // Clean the thread error since we've returned the error
+ }
}
return result;
}
loser:
SEC_ASN1EncoderFinish(p7ecx->ecx);
PORT_Free (p7ecx);
+ PORT_SetError(0); // Clean the thread error since we've returned the error
return result;
}