X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/6b200bc335dc93c5516ccb52f14bd896d8c7fad7..07691282a056c4efea71e1e505527601e8cc166b:/OSX/libsecurity_smime/lib/cmsencode.c diff --git a/OSX/libsecurity_smime/lib/cmsencode.c b/OSX/libsecurity_smime/lib/cmsencode.c index 65d0f9ad..04d20168 100644 --- a/OSX/libsecurity_smime/lib/cmsencode.c +++ b/OSX/libsecurity_smime/lib/cmsencode.c @@ -193,8 +193,10 @@ nss_cms_encoder_notify(void *arg, Boolean before, void *dest, int 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)) && @@ -206,8 +208,10 @@ nss_cms_encoder_notify(void *arg, Boolean before, void *dest, int depth) 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; @@ -528,6 +532,9 @@ SecCmsEncoderCreate(SecCmsMessageRef cmsg, 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); @@ -564,8 +571,11 @@ SecCmsEncoderCreate(SecCmsMessageRef cmsg, 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 */ @@ -573,7 +583,8 @@ SecCmsEncoderCreate(SecCmsMessageRef cmsg, 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; @@ -594,7 +605,8 @@ SecCmsEncoderCreate(SecCmsMessageRef cmsg, * 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; } @@ -644,8 +656,10 @@ SecCmsEncoderUpdate(SecCmsEncoderRef p7ecx, const void *data, CFIndex len) /* 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; } @@ -751,6 +765,7 @@ SecCmsEncoderFinish(SecCmsEncoderRef p7ecx) loser: SEC_ASN1EncoderFinish(p7ecx->ecx); PORT_Free (p7ecx); + PORT_SetError(0); // Clean the thread error since we've returned the error return result; }