1

arc の下のそのコードのすべての SecPKCS12Import 行で、iOS 機器によるメモリ リークが見つかりました。

    SecCertificateRef certRef = SecTrustGetCertificateAtIndex(trustRef, 0);
    CFStringRef certSummary = SecCertificateCopySubjectSummary(certRef);
    NSData *data = (__bridge_transfer NSData *) SecCertificateCopyData(certRef);
    NSURL *indexURL = [[NSBundle mainBundle] URLForResource:@"cert1" withExtension:@"p12"];
    NSData *localP12 = [NSData dataWithContentsOfURL:indexURL];
    NSMutableDictionary * options = [[NSMutableDictionary alloc] init];
    NSString *password = ///
    [options setObject:password forKey:(__bridge id)kSecImportExportPassphrase];
    CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
    OSStatus securityError = SecPKCS12Import((__bridge CFDataRef) localP12,(__bridge CFDictionaryRef)options, &items);
    if (securityError == noErr) { };/// good } else { //bad }
    CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);
    CFArrayRef certificates =
    (CFArrayRef)CFDictionaryGetValue(identityDict,kSecImportItemCertChain);
    SecCertificateRef localCert = (SecCertificateRef)CFArrayGetValueAtIndex(certificates,0);
    CFDataRef dataLocal = SecCertificateCopyData(localCert);
    NSData *local = (__bridge NSData *)dataLocal;
    //NSLog(@"local:%@",local);
    NSURL *indexURLmac3 = [[NSBundle mainBundle] URLForResource:@"cert2" withExtension:@"p12"];
    NSData *localP12mac3 = [NSData dataWithContentsOfURL:indexURLmac3];
    NSMutableDictionary * optionsMac3 = [[NSMutableDictionary alloc] init];
    NSString *passwordMac3 = //
    [optionsMac3 setObject:passwordMac3 forKey:(__bridge id)kSecImportExportPassphrase];
    CFArrayRef itemsMac3 = CFArrayCreate(NULL, 0, 0, NULL);
    securityError = SecPKCS12Import((__bridge CFDataRef) localP12mac3, (__bridge CFDictionaryRef)optionsMac3, &itemsMac3);
    if (securityError == noErr) { };/// good } else { //bad }
    CFDictionaryRef identityDictMac3 = CFArrayGetValueAtIndex(itemsMac3, 0);
    CFArrayRef certificatesMac3 =
    (CFArrayRef)CFDictionaryGetValue(identityDictMac3, kSecImportItemCertChain);
    SecCertificateRef localCertMac3 = (SecCertificateRef)CFArrayGetValueAtIndex(certificatesMac3,0);
    CFDataRef dataLocalMac3 = SecCertificateCopyData(localCertMac3);
    NSData *localMac3 = (__bridge NSData *)dataLocalMac3;
    NSURL *indexURLwebcob3 = [[NSBundle mainBundle] URLForResource:@"cert3" withExtension:@"p12"];
    NSData *localP12wwebcob3 = [NSData dataWithContentsOfURL:indexURLwebcob3];
    NSMutableDictionary * optionsWebcob3 = [[NSMutableDictionary alloc] init];
    NSString *passwordWebcob3 = //
    [optionsWebcob3 setObject:passwordWebcob3 forKey:(__bridge id)kSecImportExportPassphrase];
    CFArrayRef itemsWebcob3 = CFArrayCreate(NULL, 0, 0, NULL);
    securityError = SecPKCS12Import((__bridge CFDataRef) localP12wwebcob3, (__bridge CFDictionaryRef)optionsWebcob3, &itemsWebcob3);
    if (securityError == noErr) { };/// good } else { //bad }
    CFDictionaryRef identityDictWebcob3 = CFArrayGetValueAtIndex(itemsWebcob3, 0);
    CFArrayRef certificatesWebcob3 =
    (CFArrayRef)CFDictionaryGetValue(identityDictWebcob3,
                                     kSecImportItemCertChain);
    SecCertificateRef localCertWebcob3 = (SecCertificateRef)CFArrayGetValueAtIndex(certificatesWebcob3,0);
    CFDataRef dataLocalWebcob3 = SecCertificateCopyData(localCertWebcob3);
    NSData *localWebcob3 = (__bridge NSData *)dataLocalWebcob3;
    if ([data isEqualToData:local] || [data isEqualToData:localMac3] || [data isEqualToData:localWebcob3]) trust = YES;

    CFRelease(certSummary);
    CFRelease((CFDataRef) dataLocal);
    CFRelease((CFDataRef) dataLocalMac3);
    CFRelease((CFDataRef) dataLocalWebcob3);

どこが間違っていますか?

4

1 に答える 1

2

わお。そのコードに従うのは本当に難しいです。3 つの異なる PKCS12 インポートを行っているようです。それを 3 回呼び出される単一のメソッドにしたい場合があります。ただ言って。

とにかく、あなたのコードに従わなくても、私は問題が何であるかを知っています.これは以前に見たことがあるからです. 使用しているセキュリティ メソッドは、ここで定義されている CoreFoundation メモリ管理パターンに従います。PKCS12 ID インポート プロセスがリークしていることに、誰かが気付いていなかったり、ARC へのブリッジ キャストが機能するだけだと思ったりしたことが何度もありました。

しかし、ここにあなたが見るべきものがあります-もちろん、Instrumentsがあなたに伝えようとしているものに加えて:

  • 最後の引数として渡された項目を解放する必要がありますSecPKCS12Import(ドキュメントの CFArrayRef)。ガイダンスについては、 Apple の例を参照してください。

  • さらに明白なことがわかります-CFArrayCreate対応するリリースなしで呼び出しています。

于 2013-04-25T22:23:00.217 に答える