]> granicus.if.org Git - curl/commitdiff
darwinssl: fix potential crash when attempting to copy an identity
authorNick Zitzmann <nickzman@gmail.com>
Wed, 14 May 2014 22:48:14 +0000 (17:48 -0500)
committerNick Zitzmann <nickzman@gmail.com>
Wed, 14 May 2014 22:48:14 +0000 (17:48 -0500)
from a P12 file

This could've happened if SecPKCS12Import() returned noErr _and_ no
identity.

lib/vtls/curl_darwinssl.c

index 3a9da91ccf4b30d70b117380c91cb8712ebe7172..3627963dd45a288397b23c1408070e28fdaa33c1 100644 (file)
@@ -952,7 +952,7 @@ static OSStatus CopyIdentityFromPKCS12File(const char *cPath,
 
     /* Here we go: */
     status = SecPKCS12Import(pkcs_data, options, &items);
-    if(status == noErr) {
+    if(status == noErr && items && CFArrayGetCount(items)) {
       CFDictionaryRef identity_and_trust = CFArrayGetValueAtIndex(items, 0L);
       const void *temp_identity = CFDictionaryGetValue(identity_and_trust,
         kSecImportItemIdentity);
@@ -960,8 +960,10 @@ static OSStatus CopyIdentityFromPKCS12File(const char *cPath,
       /* Retain the identity; we don't care about any other data... */
       CFRetain(temp_identity);
       *out_cert_and_key = (SecIdentityRef)temp_identity;
-      CFRelease(items);
     }
+
+    if(items)
+      CFRelease(items);
     CFRelease(options);
     CFRelease(pkcs_data);
   }