SecPKCS12Import导致内存泄漏

时间:2012-07-26 14:02:02

标签: ios memory-leaks ssl

我的应用使用相互身份验证连接到我的服务器,所以我有一个包含证书的.p12文件。一切都按照预期的方式工作,但是当我使用Instruments分析我的应用程序时,它会在此行检测到内存泄漏:

if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodClientCertificate]){

    NSData* p12data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"client" ofType:@"p12"]];

    CFArrayRef itemsCFArray = nil;

    NSDictionary* dico = [NSDictionary dictionaryWithObjectsAndKeys:@"password",kSecImportExportPassphrase, nil];
    // MEMORY LEAK just below
    OSStatus check = SecPKCS12Import((__bridge CFDataRef)p12data, (__bridge CFDictionaryRef)dico, &itemsCFArray); 

    if(check != noErr){
        NSLog(@"Error importing PKCS");
    }

    NSArray* items = (__bridge NSArray*)itemsCFArray;


    SecIdentityRef identityRef = (__bridge SecIdentityRef)[[items objectAtIndex:0] objectForKey:(__bridge id)kSecImportItemIdentity];

    NSURLCredential* credential = [NSURLCredential credentialWithIdentity:identityRef certificates:nil persistence:NSURLCredentialPersistenceNone];

    [challenge.sender useCredential:credential forAuthenticationChallenge:challenge];

}

我尝试使用CFDictionaryRef,但它没有解决错误。

我找到了有同样问题的人,但他的解决方案是ios4,我使用的是ios5(实际上,我已经做了同样的事情):http://www.ipup.fr/forum/viewtopic.php?id=2855(法语,抱歉)

我该如何解决这个问题? Apple会因为内存泄漏而拒绝我的应用程序吗?

1 个答案:

答案 0 :(得分:0)

我认为问题不在于字典,itemsCFArray似乎正在泄露。 SecPKCS12Import将CF引用传递回itemsCFArray,当您完成使用其中的对象时,您将需要CFRelease。

在创建凭证后尝试调用CFRelease(itemsCFArray)。