pluto: Locking fixed in cert_add.
authorTobias Brunner <tobias@strongswan.org>
Fri, 22 Oct 2010 09:05:10 +0000 (11:05 +0200)
committerTobias Brunner <tobias@strongswan.org>
Tue, 26 Oct 2010 07:58:13 +0000 (09:58 +0200)
src/pluto/certs.c

index a9179c4..e866022 100644 (file)
@@ -74,20 +74,21 @@ void cert_free(cert_t *cert)
 cert_t* cert_add(cert_t *cert)
 {
        certificate_t *certificate = cert->cert;
-       cert_t *c = certs;
+       cert_t *c;
 
-       while (c != NULL)
+       lock_certs_and_keys("cert_add");
+
+       for (c = certs; c != NULL; c = c->next)
        {
-               if (certificate->equals(certificate, c->cert)) /* already in chain, free cert */
-               {
+               if (certificate->equals(certificate, c->cert))
+               {       /* already in chain, free cert */
+                       unlock_certs_and_keys("cert_add");
                        cert_free(cert);
                        return c;
                }
-               c = c->next;
        }
 
        /* insert new cert at the root of the chain */
-       lock_certs_and_keys("cert_add");
        cert->next = certs;
        certs = cert;
        DBG(DBG_CONTROL | DBG_PARSING,