]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
nss: avoid a SIGSEGV with immature version of NSS
authorKamil Dudka <kdudka@redhat.com>
Tue, 6 Sep 2011 16:17:38 +0000 (18:17 +0200)
committerKamil Dudka <kdudka@redhat.com>
Mon, 17 Oct 2011 10:13:44 +0000 (12:13 +0200)
Bug: https://bugzilla.redhat.com/733685

lib/nss.c

index 25293d5a5930ee28a0d25b654024ea16d6dfb1ce..f63d9718be191db663ebef6c883eb38a37408664 100644 (file)
--- a/lib/nss.c
+++ b/lib/nss.c
@@ -382,7 +382,29 @@ static CURLcode nss_load_cert(struct ssl_connect_data *ssl,
   /* libnsspem.so leaks memory if the requested file does not exist.  For more
    * details, go to <https://bugzilla.redhat.com/734760>. */
   if(is_file(filename))
-    return nss_create_object(ssl, CKO_CERTIFICATE, filename, cacert);
+    err = nss_create_object(ssl, CKO_CERTIFICATE, filename, cacert);
+
+  if(CURLE_OK == err && !cacert) {
+    /* we have successfully loaded a client certificate */
+    CERTCertificate *cert;
+    char *nickname = NULL;
+    char *n = strrchr(filename, '/');
+    if(n)
+      n++;
+
+    /* The following undocumented magic helps to avoid a SIGSEGV on call
+     * of PK11_ReadRawAttribute() from SelectClientCert() when using an
+     * immature version of libnsspem.so.  For more details, go to
+     * <https://bugzilla.redhat.com/733685>. */
+    nickname = aprintf("PEM Token #1:%s", n);
+    if(nickname) {
+      cert = PK11_FindCertFromNickname(nickname, NULL);
+      if(cert)
+        CERT_DestroyCertificate(cert);
+
+      free(nickname);
+    }
+  }
 #endif
 
   return err;