x509: Fix public key reference leak if authority key identifier does not match
authorMartin Willi <martin@revosec.ch>
Fri, 6 Feb 2015 12:58:58 +0000 (13:58 +0100)
committerMartin Willi <martin@revosec.ch>
Fri, 6 Feb 2015 12:58:58 +0000 (13:58 +0100)
src/libstrongswan/plugins/x509/x509_crl.c

index d171ec2..1f3f60d 100644 (file)
@@ -462,17 +462,26 @@ METHOD(certificate_t, issued_by, bool,
                return FALSE;
        }
 
-       /* get the public key of the issuer */
+       scheme = signature_scheme_from_oid(this->algorithm);
+       if (scheme == SIGN_UNKNOWN)
+       {
+               return FALSE;
+       }
        key = issuer->get_public_key(issuer);
+       if (!key)
+       {
+               return FALSE;
+       }
 
        /* compare keyIdentifiers if available, otherwise use DNs */
-       if (this->authKeyIdentifier.ptr && key)
+       if (this->authKeyIdentifier.ptr)
        {
                chunk_t fingerprint;
 
                if (!key->get_fingerprint(key, KEYID_PUBKEY_SHA1, &fingerprint) ||
                        !chunk_equals(fingerprint, this->authKeyIdentifier))
                {
+                       key->destroy(key);
                        return FALSE;
                }
        }
@@ -480,17 +489,10 @@ METHOD(certificate_t, issued_by, bool,
        {
                if (!this->issuer->equals(this->issuer, issuer->get_subject(issuer)))
                {
+                       key->destroy(key);
                        return FALSE;
                }
        }
-
-       /* determine signature scheme */
-       scheme = signature_scheme_from_oid(this->algorithm);
-
-       if (scheme == SIGN_UNKNOWN || key == NULL)
-       {
-               return FALSE;
-       }
        valid = key->verify(key, scheme, this->tbsCertList, this->signature);
        key->destroy(key);
        if (valid && schemep)