Possible memory leak in pgcrypto with EVP_MD_CTX

Started by Michael Paquierover 5 years ago2 messageshackers
Jump to latest
#1Michael Paquier
michael@paquier.xyz

Hi all,

It happens that pgcrypto has the following leak if a digest cannot be
initialized:
--- a/contrib/pgcrypto/openssl.c
+++ b/contrib/pgcrypto/openssl.c
@@ -202,6 +202,7 @@ px_find_digest(const char *name, PX_MD **res)
    }
    if (EVP_DigestInit_ex(ctx, md, NULL) == 0)
    {
+       EVP_MD_CTX_destroy(ctx);
        pfree(digest);
        return -1;
    }

That's a bit annoying, because this memory is allocated directly by
OpenSSL, and Postgres does not know how to free it until it gets
registered in the list of open_digests that would be used by the
cleanup callback, so I think that we had better back-patch this fix.

Thoughts?
--
Michael

Attachments:

pgcrypto-leak.patchtext/x-diff; charset=us-asciiDownload+1-0
#2Michael Paquier
michael@paquier.xyz
In reply to: Michael Paquier (#1)
Re: Possible memory leak in pgcrypto with EVP_MD_CTX

On Thu, Oct 15, 2020 at 04:22:12PM +0900, Michael Paquier wrote:

That's a bit annoying, because this memory is allocated directly by
OpenSSL, and Postgres does not know how to free it until it gets
registered in the list of open_digests that would be used by the
cleanup callback, so I think that we had better back-patch this fix.

Hearing nothing, I have fixed the issue and back-patched it.

While looking at it, I have noticed that e2838c58 has never actually
worked with OpenSSL 0.9.6 because we lack an equivalent for
EVP_MD_CTX_destroy() and EVP_MD_CTX_create(). This issue would be
easy enough to fix as the size of EVP_MD_CTX is known in those
versions of OpenSSL, but as we have heard zero complaints on this
matter I have left that out in the 9.5 and 9.6 branches. Back in
2016, even 0.9.8 was barely used, so I can't even imagine somebody
using 0.9.6 with the most recent PG releases.
--
Michael