Fix an ENGINE leak in asn1_item_digest_with_libctx
authorMatt Caswell <matt@openssl.org>
Thu, 30 Jul 2020 14:15:05 +0000 (15:15 +0100)
committerPauli <paul.dale@oracle.com>
Sat, 1 Aug 2020 01:55:34 +0000 (11:55 +1000)
Commit 6725682d introduced a call to ENGINE_get_digest_engine() into
the function asn1_item_digest_with_libctx() to determine whether there
is an ENGINE registered to handle the specified digest. However that
function increases the ref count on the returned ENGINE object, so it
must be freed.

Fixes #12558

[extended tests]

Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Nicola Tuveri <nic.tuv@gmail.com>
(Merged from https://github.com/openssl/openssl/pull/12560)

crypto/asn1/a_digest.c

index c0c1cda2727c922f5f61f31c45d828455d7532df..3e7b418a1945a3bf8d74791042bf40af6395f015 100644 (file)
@@ -68,7 +68,11 @@ int asn1_item_digest_with_libctx(const ASN1_ITEM *it, const EVP_MD *md,
 
     if (EVP_MD_provider(md) == NULL) {
 #if !defined(OPENSSL_NO_ENGINE)
-        if (ENGINE_get_digest_engine(EVP_MD_type(md)) == NULL)
+        ENGINE *tmpeng = ENGINE_get_digest_engine(EVP_MD_type(md));
+
+        if (tmpeng != NULL)
+            ENGINE_finish(tmpeng);
+        else
 #endif
             fetched_md = EVP_MD_fetch(libctx, EVP_MD_name(md), propq);
     }