SecCmsMessageRef Download::GetCmsMessageFromData (CFDataRef data) { // setup decoding SecCmsDecoderRef decoderContext; int result = SecCmsDecoderCreate (NULL, NULL, NULL, NULL, NULL, NULL, NULL, &decoderContext); if (result) { MacOSError::throwMe (errSecureDownloadInvalidTicket); } result = SecCmsDecoderUpdate (decoderContext, CFDataGetBytePtr (data), CFDataGetLength (data)); if (result) { SecCmsDecoderDestroy(decoderContext); MacOSError::throwMe (errSecureDownloadInvalidTicket); } SecCmsMessageRef message; result = SecCmsDecoderFinish (decoderContext, &message); if (result) { MacOSError::throwMe (errSecureDownloadInvalidTicket); } return message; }
/* * Dispose of a CMSDecoder. Called out from CFRelease(). */ static void cmsDecoderFinalize( CFTypeRef dec) { CMSDecoderRef cmsDecoder = (CMSDecoderRef)dec; if(cmsDecoder == NULL) { return; } if(cmsDecoder->decoder != NULL) { /* * Normally this gets freed in SecCmsDecoderFinish - this is * an error case. * FIXME: SecCmsDecoderDestroy() appears to destroy the * cmsMsg too! Plus there's a comment there re: a leak... */ SecCmsDecoderDestroy(cmsDecoder->decoder); } CFRELEASE(cmsDecoder->detachedContent); CFRELEASE(cmsDecoder->keychainOrArray); if(cmsDecoder->cmsMsg != NULL) { SecCmsMessageDestroy(cmsDecoder->cmsMsg); } if(cmsDecoder->arena != NULL) { SecArenaPoolFree(cmsDecoder->arena, false); } }